From df824e24e881e15463dbf3554ba6eaed18bc485d Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Mon, 18 Jul 2022 14:55:52 -0600 Subject: [PATCH] Update develop-ref after #1697 (#1701) Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> Co-authored-by: Mrinal Biswas Co-authored-by: Hank Fisher Co-authored-by: Minna Win Co-authored-by: bikegeek <3753118+bikegeek@users.noreply.github.com> Co-authored-by: Christina Kalb Co-authored-by: Julie Prestopnik Co-authored-by: johnhg Co-authored-by: Hank Fisher Co-authored-by: Mrinal Biswas Co-authored-by: jprestop Co-authored-by: j-opatz Co-authored-by: Kathryn Newman Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com> Co-authored-by: Lisa Goodrich Co-authored-by: Julie Prestopnik Co-authored-by: Christina Kalb Co-authored-by: lisagoodrich <33230218+lisagoodrich@users.noreply.github.com> Co-authored-by: bikegeek Co-authored-by: Hank Fisher Co-authored-by: Christina Kalb Co-authored-by: Howard Soh Co-authored-by: Molly Smith Co-authored-by: hsoh-u --- .github/actions/run_tests/entrypoint.sh | 18 +- .github/jobs/free_disk_space.sh | 15 + .github/jobs/get_metviewer.sh | 4 +- .github/jobs/get_use_case_commands.py | 8 +- .github/jobs/get_use_cases_to_run.sh | 7 +- .github/jobs/run_difference_tests.sh | 2 +- ..._metdatadb.cfg => Externals_metdataio.cfg} | 4 +- .github/parm/pytest_groups.txt | 6 + .github/parm/use_case_groups.json | 43 ++- .github/workflows/testing.yml | 11 +- docs/Contributors_Guide/add_use_case.rst | 346 ++++++++--------- .../continuous_integration.rst | 154 +++++--- docs/Contributors_Guide/documentation.rst | 86 ++--- docs/Contributors_Guide/github_workflow.rst | 3 + docs/Contributors_Guide/testing.rst | 48 ++- docs/Users_Guide/glossary.rst | 43 +++ docs/Users_Guide/quicksearch.rst | 8 +- docs/Users_Guide/wrappers.rst | 7 + .../datasets/aeronet.rst | 2 +- .../datasets/gdas_prepbufr.rst | 2 +- .../datasets/goes_level_1b.rst | 2 +- .../datasets/goes_level_2_aerosol.rst | 2 +- docs/Verification_Datasets/datasets/madis.rst | 2 +- .../datasets/metar_isu.rst | 2 +- docs/Verification_Datasets/datasets/mping.rst | 2 +- .../datasets/mrms_composite_reflectivity.rst | 2 +- .../datasets/nexrad_level_2.rst | 2 +- .../datasets/nexrad_level_3.rst | 2 +- .../datasets/opera_eumetnet.rst | 2 +- .../datasets/template.rst | 2 +- docs/Verification_Datasets/datasets/viirs.rst | 2 +- docs/Verification_Datasets/quicksearch.rst | 42 +-- ...tat_fcstCFSv2_obsGHCNCAMS_MultiTercile.png | Bin 0 -> 727740 bytes ...at-UserScript_fcstGFS_obsERA_Blocking.png} | Bin ...erScript_fcstGFS_obsERA_WeatherRegime.png} | Bin ...at-UserScript_obsERA_obsOnly_Blocking.png} | Bin ...erScript_obsERA_obsOnly_WeatherRegime.png} | Bin ...s2s_mjo-UserScript_fcstGFS_obsERA_OMI.png} | Bin ...s2s_mjo-UserScript_obsERA_obsOnly_OMI.png} | Bin ...serScript_obsERA_obsOnly_PhaseDiagram.png} | Bin ...s2s_mjo-UserScript_obsERA_obsOnly_RMM.png} | Bin ...tat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png} | Bin ...tat_fcstHRRR_fcstOnly_SurrogateSevere.png} | Bin ...at_fcstFV3_obsGOES_BrightnessTempDmap.png} | Bin ...dbLoad_fcstFV3_obsGoes_BrightnessTemp.png} | Bin ...e-MODE_fcstFV3_obsGOES_BrightnessTemp.png} | Bin ...DE_fcstFV3_obsGOES_BrightnessTempObjs.png} | Bin ...nge-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png} | Bin ...rt_range-MTD_fcstHREF_FcstOnly_Gempak.png} | Bin ...rid_obsLSR_ObsOnly_PracticallyPerfect.png} | Bin ...PP_prob.png => short_range-SS_PP_prob.png} | Bin .../convection_allowing_models/README.rst | 3 - ...Stat_fcstCFSv2_obsGHCNCAMS_MultiTercile.py | 144 ++++++++ .../model_applications/s2s_mid_lat/README.rst | 3 + .../UserScript_fcstGFS_obsERA_Blocking.py | 19 +- ...UserScript_fcstGFS_obsERA_WeatherRegime.py | 19 +- .../UserScript_obsERA_obsOnly_Blocking.py | 19 +- ...UserScript_obsERA_obsOnly_WeatherRegime.py | 19 +- .../model_applications/s2s_mjo/README.rst | 3 + .../UserScript_fcstGFS_obsERA_OMI.py | 21 +- .../UserScript_obsERA_obsOnly_OMI.py | 23 +- .../UserScript_obsERA_obsOnly_PhaseDiagram.py | 25 +- .../UserScript_obsERA_obsOnly_RMM.py | 27 +- ...eStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py | 16 +- ...eStat_fcstHRRR_fcstOnly_SurrogateSevere.py | 14 +- ...Stat_fcstFV3_obsGOES_BrightnessTempDmap.py | 16 +- ...fcstHRRR_obsPracPerfect_SurrogateSevere.py | 16 +- ...HRRR_obsPracPerfect_SurrogateSevereProb.py | 16 +- ...ETdbLoad_fcstFV3_obsGoes_BrightnessTemp.py | 12 +- .../MODE_fcstFV3_obsGOES_BrightnessTemp.py | 16 +- ...MODE_fcstFV3_obsGOES_BrightnessTempObjs.py | 16 +- .../MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py | 14 +- ...2Grid_obsLSR_ObsOnly_PracticallyPerfect.py | 20 +- .../model_applications/short_range/README.rst | 3 + .../make_plots/test_make_plots_wrapper.py | 70 +--- .../plotting/plot_util/test_plot_util.py | 57 ++- .../tcmpr_plotter/test_tcmpr_plotter.py | 14 +- internal_tests/pytests/produtil/README | 23 -- .../pytests/produtil/produtil_test.conf | 31 -- .../pytests/produtil/test_produtil.py | 144 -------- ...rk_in_progress_test_produtil_regression.py | 159 -------- internal_tests/pytests/pytest.ini | 9 + .../pytests/{ => util}/config/config_1.conf | 0 .../pytests/{ => util}/config/config_2.conf | 0 .../pytests/{ => util}/config/config_3.conf | 0 .../pytests/{ => util}/config/test_config.py | 62 ++-- .../config_metplus/test_config_metplus.py | 125 +++++-- .../{ => util}/logging/test_logging.py | 30 +- .../{ => util}/met_config/test_met_config.py | 23 +- .../{ => util}/met_util/test_met_util.py | 112 ++++-- .../metplus_check/test_metplus_check.py | 18 +- .../string_manip/test_util_string_manip.py | 10 +- .../test_string_template_substitution.py | 155 +++++--- .../util/time_looping/test_time_looping.py | 60 +++ .../{ => util}/time_util/test_time_util.py | 32 +- .../ascii2nc/test_ascii2nc_wrapper.py | 15 +- .../command_builder/test_command_builder.py | 52 ++- .../compare_gridded/test_compare_gridded.py | 60 +-- .../test_ensemble_stat_wrapper.py | 21 +- .../extract_tiles/extract_tiles_test.conf | 0 .../extract_tiles/test_extract_tiles.py | 29 +- .../gen_ens_prod/test_gen_ens_prod_wrapper.py | 20 +- .../gen_vx_mask/test_gen_vx_mask.py | 44 +-- .../grid_diag/test_grid_diag.py | 25 +- .../grid_stat/test_grid_stat_wrapper.py | 25 +- .../ioda2nc/test_ioda2nc_wrapper.py | 12 +- .../met_db_load/test_met_db_load.py | 4 + .../{ => wrappers}/mode/test_mode_wrapper.py | 18 +- .../{ => wrappers}/mtd/test_mtd_wrapper.py | 16 +- .../pytests/{ => wrappers}/pb2nc/__init__.py | 0 .../pytests/{ => wrappers}/pb2nc/conf1 | 0 .../pb2nc/test_pb2nc_wrapper.py | 54 +-- .../{ => wrappers}/pcp_combine/test1.conf | 0 .../pcp_combine/test_deprecated.conf | 0 .../pcp_combine/test_pcp_combine_wrapper.py | 42 ++- .../point2grid/test_point2grid.py | 37 +- .../{ => wrappers}/point_stat/__init__.py | 0 .../point_stat/point_stat_test_conus_sfc.conf | 0 .../point_stat/point_stat_test_upper_air.conf | 0 .../refactor_point_stat_test_conus_sfc.conf | 0 .../point_stat/test_point_stat_wrapper.py | 20 +- .../test_regrid_data_plane.py | 57 +-- .../runtime_freq/test_runtime_freq.py | 15 +- .../series_analysis/series_test.conf | 0 .../series_analysis/test_series_analysis.py | 72 ++-- .../{ => wrappers}/stat_analysis/test.conf | 0 .../stat_analysis/test_plotting.conf | 0 .../stat_analysis/test_stat_analysis.py | 313 +++++++--------- .../test_stat_analysis_plotting.py | 140 +------ .../tc_gen/test_tc_gen_wrapper.py | 25 +- .../tc_pairs/tc_pairs_wrapper_test.conf | 0 .../tc_pairs/test_tc_pairs_wrapper.py | 42 ++- .../{ => wrappers}/tc_stat/tc_stat_conf.conf | 0 .../tc_stat/test_tc_stat_wrapper.py | 20 +- .../user_script/test_user_script.py | 14 +- internal_tests/use_cases/all_use_cases.txt | 57 +-- .../use_cases/metplus_use_case_suite.py | 12 +- internal_tests/use_cases/test_use_cases.py | 4 +- metplus/util/time_looping.py | 45 ++- metplus/util/time_util.py | 2 +- metplus/wrappers/met_db_load_wrapper.py | 2 +- metplus/wrappers/stat_analysis_wrapper.py | 65 ++-- .../met_tool_wrapper/ASCII2NC/ASCII2NC.conf | 102 ++--- .../ASCII2NC/ASCII2NC_python_embedding.conf | 104 ++---- .../CyclonePlotter/CyclonePlotter.conf | 80 ++-- .../EnsembleStat/EnsembleStat.conf | 29 +- .../EnsembleStat_python_embedding.conf | 179 ++++----- .../met_tool_wrapper/Example/Example.conf | 62 ++-- .../ExtractTiles/ExtractTiles.conf | 92 +++-- .../ExtractTiles/ExtractTiles_mtd.conf | 83 +++-- .../GFDLTracker/GFDLTracker_ETC.conf | 35 ++ .../GFDLTracker/GFDLTracker_Genesis.conf | 35 +- .../GFDLTracker/GFDLTracker_TC.conf | 35 ++ .../GempakToCF/GempakToCF.conf | 64 ++-- .../GenEnsProd/GenEnsProd.conf | 34 +- .../met_tool_wrapper/GenVxMask/GenVxMask.conf | 89 ++--- .../GenVxMask/GenVxMask_multiple.conf | 82 ++--- .../GenVxMask/GenVxMask_with_arguments.conf | 82 ++--- .../met_tool_wrapper/GridDiag/GridDiag.conf | 95 ++--- .../met_tool_wrapper/GridStat/GridStat.conf | 41 ++- .../GridStat/GridStat_forecast.conf | 54 +-- .../GridStat/GridStat_observation.conf | 50 +-- .../GridStat/GridStat_python_embedding.conf | 176 +++------ .../met_tool_wrapper/IODA2NC/IODA2NC.conf | 33 +- .../met_tool_wrapper/METdbLoad/METdbLoad.conf | 47 ++- .../use_cases/met_tool_wrapper/MODE/MODE.conf | 80 ++-- .../MODE/MODE_python_embedding.conf | 170 +++------ parm/use_cases/met_tool_wrapper/MTD/MTD.conf | 133 +++---- .../MTD/MTD_python_embedding.conf | 144 +++----- .../met_tool_wrapper/PB2NC/PB2NC.conf | 38 +- .../PCPCombine/PCPCombine_add.conf | 37 +- .../PCPCombine/PCPCombine_bucket.conf | 38 +- .../PCPCombine/PCPCombine_derive.conf | 40 +- .../PCPCombine/PCPCombine_loop_custom.conf | 44 ++- .../PCPCombine_python_embedding.conf | 43 ++- .../PCPCombine/PCPCombine_subtract.conf | 41 ++- .../PCPCombine/PCPCombine_sum.conf | 40 +- .../PCPCombine/PCPCombine_user_defined.conf | 40 +- .../PlotDataPlane/PlotDataPlane_grib1.conf | 79 ++-- .../PlotDataPlane/PlotDataPlane_netcdf.conf | 78 ++-- .../PlotDataPlane_python_embedding.conf | 77 ++-- .../Point2Grid/Point2Grid.conf | 107 +++--- .../met_tool_wrapper/PointStat/PointStat.conf | 27 +- .../PointStat/PointStat_once_per_field.conf | 179 ++++----- .../PointStat/PointStat_python_embedding.conf | 160 +++----- .../PointStat_python_embedding_obs.conf | 27 +- .../PyEmbedIngest/PyEmbedIngest.conf | 89 ++--- .../PyEmbedIngest_multi_field_one_file.conf | 90 ++--- .../RegridDataPlane/RegridDataPlane.conf | 110 +++--- ...egridDataPlane_multi_field_multi_file.conf | 116 +++--- .../RegridDataPlane_multi_field_one_file.conf | 114 +++--- .../RegridDataPlane_python_embedding.conf | 85 +++-- .../SeriesAnalysis/SeriesAnalysis.conf | 37 +- .../SeriesAnalysis_python_embedding.conf | 111 +++--- .../StatAnalysis/StatAnalysis.conf | 127 ++----- .../StatAnalysis_python_embedding.conf | 130 ++----- .../met_tool_wrapper/TCGen/TCGen.conf | 64 ++-- .../TCMPRPlotter/TCMPRPlotter.conf | 61 +-- .../TCPairs/TCPairs_extra_tropical.conf | 25 +- .../TCPairs/TCPairs_tropical.conf | 23 +- .../met_tool_wrapper/TCRMW/TCRMW.conf | 101 ++--- .../met_tool_wrapper/TCStat/TCStat.conf | 124 ++----- .../UserScript/UserScript_run_once.conf | 63 ++-- .../UserScript_run_once_for_each.conf | 63 ++-- .../UserScript_run_once_per_init.conf | 63 ++-- .../UserScript_run_once_per_valid.conf | 63 ++-- ...at_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf | 102 +++++ ...ast_read-in_CFSv2_categoricalthresholds.py | 183 +++++++++ ...read-in_CFSv2_categoricalthresholds_obs.py | 186 ++++++++++ .../preprocessFun_Modified.py | 348 ++++++++++++++++++ .../UserScript_fcstGFS_obsERA_Blocking.conf | 38 +- .../Blocking_driver.py | 0 ...erScript_fcstGFS_obsERA_WeatherRegime.conf | 28 +- .../WeatherRegime_driver.py | 0 .../UserScript_obsERA_obsOnly_Blocking.conf | 22 +- .../Blocking_driver.py | 0 ...erScript_obsERA_obsOnly_WeatherRegime.conf | 20 +- .../WeatherRegime_driver.py | 0 .../UserScript_fcstGFS_obsERA_OMI.conf | 18 +- .../OMI_driver.py | 0 .../read_netcdf.yaml | 0 .../UserScript_obsERA_obsOnly_OMI.conf | 12 +- .../OMI_driver.py | 0 ...serScript_obsERA_obsOnly_PhaseDiagram.conf | 10 +- .../PhaseDiagram_driver.py | 0 .../save_input_files_txt.py | 0 .../UserScript_obsERA_obsOnly_RMM.conf | 52 +-- .../RMM_driver.py | 0 .../compute_harmonic_anomalies.py | 0 ...tat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf | 18 +- .../obs_error_table_V8.0.txt | 0 ...tat_fcstHRRR_fcstOnly_SurrogateSevere.conf | 4 +- ...at_fcstFV3_obsGOES_BrightnessTempDmap.conf | 6 +- ...stHRRR_obsPracPerfect_SurrogateSevere.conf | 4 +- ...RR_obsPracPerfect_SurrogateSevereProb.conf | 4 +- ...dbLoad_fcstFV3_obsGoes_BrightnessTemp.conf | 4 +- .../MODE_fcstFV3_obsGOES_BrightnessTemp.conf | 8 +- .../ci_overrides.conf | 0 ...DE_fcstFV3_obsGOES_BrightnessTempObjs.conf | 10 +- .../MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf | 6 +- ...rid_obsLSR_ObsOnly_PracticallyPerfect.conf | 14 +- .../read_ascii_storm.py | 0 scripts/docker/docker_env/README.md | 6 +- .../{metdatadb_env.sh => metdataio_env.sh} | 8 +- 244 files changed, 5516 insertions(+), 4437 deletions(-) create mode 100755 .github/jobs/free_disk_space.sh rename .github/parm/{Externals_metdatadb.cfg => Externals_metdataio.cfg} (59%) create mode 100644 .github/parm/pytest_groups.txt create mode 100644 docs/_static/s2s-GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.png rename docs/_static/{s2s-IBL_frequency.png => s2s_mid_lat-UserScript_fcstGFS_obsERA_Blocking.png} (100%) rename docs/_static/{s2s-OBS_ERA_weather_regime.png => s2s_mid_lat-UserScript_fcstGFS_obsERA_WeatherRegime.png} (100%) rename docs/_static/{s2s-OBS_ERA_blocking_frequency.png => s2s_mid_lat-UserScript_obsERA_obsOnly_Blocking.png} (100%) rename docs/_static/{s2s-OBS_ERA_weather_regime_freq.png => s2s_mid_lat-UserScript_obsERA_obsOnly_WeatherRegime.png} (100%) rename docs/_static/{s2s-OMI_GFS_phase_diagram.png => s2s_mjo-UserScript_fcstGFS_obsERA_OMI.png} (100%) rename docs/_static/{s2s-OMI_phase_diagram.png => s2s_mjo-UserScript_obsERA_obsOnly_OMI.png} (100%) rename docs/_static/{s2s-PhaseDiagram.png => s2s_mjo-UserScript_obsERA_obsOnly_PhaseDiagram.png} (100%) rename docs/_static/{s2s-RMM_time_series.png => s2s_mjo-UserScript_obsERA_obsOnly_RMM.png} (100%) rename docs/_static/{convection_allowing_models-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png => short_range-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png} (100%) rename docs/_static/{convection_allowing_models-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png => short_range-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png} (100%) rename docs/_static/{convection_allowing_models-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png => short_range-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png} (100%) rename docs/_static/{convection_allowing_models-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png => short_range-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png} (100%) rename docs/_static/{convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTemp.png => short_range-MODE_fcstFV3_obsGOES_BrightnessTemp.png} (100%) rename docs/_static/{convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png => short_range-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png} (100%) rename docs/_static/{convection_allowing_models-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png => short_range-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png} (100%) rename docs/_static/{convection_allowing_models-MTD_fcstHREF_FcstOnly_Gempak.png => short_range-MTD_fcstHREF_FcstOnly_Gempak.png} (100%) rename docs/_static/{convection_allowing_models-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png => short_range-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png} (100%) rename docs/_static/{convection_allowing_models-SS_PP_prob.png => short_range-SS_PP_prob.png} (100%) delete mode 100644 docs/use_cases/model_applications/convection_allowing_models/README.rst create mode 100644 docs/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.py create mode 100644 docs/use_cases/model_applications/s2s_mid_lat/README.rst rename docs/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_fcstGFS_obsERA_Blocking.py (92%) rename docs/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_fcstGFS_obsERA_WeatherRegime.py (92%) rename docs/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_obsERA_obsOnly_Blocking.py (92%) rename docs/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_obsERA_obsOnly_WeatherRegime.py (92%) create mode 100644 docs/use_cases/model_applications/s2s_mjo/README.rst rename docs/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_fcstGFS_obsERA_OMI.py (87%) rename docs/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_OMI.py (86%) rename docs/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_PhaseDiagram.py (83%) rename docs/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_RMM.py (85%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py (90%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py (93%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py (89%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py (87%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py (87%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py (91%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstFV3_obsGOES_BrightnessTemp.py (90%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py (92%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py (91%) rename docs/use_cases/model_applications/{convection_allowing_models => short_range}/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py (85%) create mode 100644 docs/use_cases/model_applications/short_range/README.rst rename internal_tests/pytests/{ => plotting}/tcmpr_plotter/test_tcmpr_plotter.py (99%) delete mode 100644 internal_tests/pytests/produtil/README delete mode 100644 internal_tests/pytests/produtil/produtil_test.conf delete mode 100644 internal_tests/pytests/produtil/test_produtil.py delete mode 100644 internal_tests/pytests/produtil/work_in_progress_test_produtil_regression.py create mode 100644 internal_tests/pytests/pytest.ini rename internal_tests/pytests/{ => util}/config/config_1.conf (100%) rename internal_tests/pytests/{ => util}/config/config_2.conf (100%) rename internal_tests/pytests/{ => util}/config/config_3.conf (100%) rename internal_tests/pytests/{ => util}/config/test_config.py (89%) rename internal_tests/pytests/{ => util}/config_metplus/test_config_metplus.py (95%) rename internal_tests/pytests/{ => util}/logging/test_logging.py (79%) rename internal_tests/pytests/{ => util}/met_config/test_met_config.py (96%) rename internal_tests/pytests/{ => util}/met_util/test_met_util.py (91%) rename internal_tests/pytests/{ => util}/metplus_check/test_metplus_check.py (85%) rename internal_tests/pytests/{StringTemplateSubstitution => util/string_template_substitution}/test_string_template_substitution.py (90%) rename internal_tests/pytests/{ => util}/time_util/test_time_util.py (85%) rename internal_tests/pytests/{ => wrappers}/ascii2nc/test_ascii2nc_wrapper.py (97%) rename internal_tests/pytests/{ => wrappers}/command_builder/test_command_builder.py (98%) rename internal_tests/pytests/{ => wrappers}/compare_gridded/test_compare_gridded.py (85%) rename internal_tests/pytests/{ => wrappers}/ensemble_stat/test_ensemble_stat_wrapper.py (99%) rename internal_tests/pytests/{ => wrappers}/extract_tiles/extract_tiles_test.conf (100%) rename internal_tests/pytests/{ => wrappers}/extract_tiles/test_extract_tiles.py (96%) rename internal_tests/pytests/{ => wrappers}/gen_ens_prod/test_gen_ens_prod_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/gen_vx_mask/test_gen_vx_mask.py (77%) rename internal_tests/pytests/{ => wrappers}/grid_diag/test_grid_diag.py (98%) rename internal_tests/pytests/{ => wrappers}/grid_stat/test_grid_stat_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/ioda2nc/test_ioda2nc_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/met_db_load/test_met_db_load.py (96%) rename internal_tests/pytests/{ => wrappers}/mode/test_mode_wrapper.py (99%) rename internal_tests/pytests/{ => wrappers}/mtd/test_mtd_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/pb2nc/__init__.py (100%) rename internal_tests/pytests/{ => wrappers}/pb2nc/conf1 (100%) rename internal_tests/pytests/{ => wrappers}/pb2nc/test_pb2nc_wrapper.py (92%) rename internal_tests/pytests/{ => wrappers}/pcp_combine/test1.conf (100%) rename internal_tests/pytests/{ => wrappers}/pcp_combine/test_deprecated.conf (100%) rename internal_tests/pytests/{ => wrappers}/pcp_combine/test_pcp_combine_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/point2grid/test_point2grid.py (81%) rename internal_tests/pytests/{ => wrappers}/point_stat/__init__.py (100%) rename internal_tests/pytests/{ => wrappers}/point_stat/point_stat_test_conus_sfc.conf (100%) rename internal_tests/pytests/{ => wrappers}/point_stat/point_stat_test_upper_air.conf (100%) rename internal_tests/pytests/{ => wrappers}/point_stat/refactor_point_stat_test_conus_sfc.conf (100%) rename internal_tests/pytests/{ => wrappers}/point_stat/test_point_stat_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/regrid_data_plane/test_regrid_data_plane.py (90%) rename internal_tests/pytests/{ => wrappers}/runtime_freq/test_runtime_freq.py (94%) rename internal_tests/pytests/{ => wrappers}/series_analysis/series_test.conf (100%) rename internal_tests/pytests/{ => wrappers}/series_analysis/test_series_analysis.py (97%) rename internal_tests/pytests/{ => wrappers}/stat_analysis/test.conf (100%) rename internal_tests/pytests/{ => wrappers}/stat_analysis/test_plotting.conf (100%) rename internal_tests/pytests/{ => wrappers}/stat_analysis/test_stat_analysis.py (78%) rename internal_tests/pytests/{ => wrappers}/stat_analysis/test_stat_analysis_plotting.py (77%) rename internal_tests/pytests/{ => wrappers}/tc_gen/test_tc_gen_wrapper.py (97%) rename internal_tests/pytests/{ => wrappers}/tc_pairs/tc_pairs_wrapper_test.conf (100%) rename internal_tests/pytests/{ => wrappers}/tc_pairs/test_tc_pairs_wrapper.py (96%) rename internal_tests/pytests/{ => wrappers}/tc_stat/tc_stat_conf.conf (100%) rename internal_tests/pytests/{ => wrappers}/tc_stat/test_tc_stat_wrapper.py (98%) rename internal_tests/pytests/{ => wrappers}/user_script/test_user_script.py (99%) create mode 100644 parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf create mode 100644 parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds.py create mode 100644 parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds_obs.py create mode 100644 parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/preprocessFun_Modified.py rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_fcstGFS_obsERA_Blocking.conf (90%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_fcstGFS_obsERA_WeatherRegime.conf (90%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_obsERA_obsOnly_Blocking.conf (89%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_obsERA_obsOnly_WeatherRegime.conf (88%) rename parm/use_cases/model_applications/{s2s => s2s_mid_lat}/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_fcstGFS_obsERA_OMI.conf (91%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_fcstGFS_obsERA_OMI/read_netcdf.yaml (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_OMI.conf (91%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_OMI/OMI_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_PhaseDiagram.conf (86%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_RMM.conf (82%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_RMM/RMM_driver.py (100%) rename parm/use_cases/model_applications/{s2s => s2s_mjo}/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py (100%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf (88%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/obs_error_table_V8.0.txt (100%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf (95%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf (82%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf (92%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf (92%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf (73%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstFV3_obsGOES_BrightnessTemp.conf (83%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf (100%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf (86%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf (87%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf (87%) rename parm/use_cases/model_applications/{convection_allowing_models => short_range}/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py (100%) rename scripts/docker/docker_env/scripts/{metdatadb_env.sh => metdataio_env.sh} (87%) diff --git a/.github/actions/run_tests/entrypoint.sh b/.github/actions/run_tests/entrypoint.sh index 53692ab10f..7e0a4b72d7 100644 --- a/.github/actions/run_tests/entrypoint.sh +++ b/.github/actions/run_tests/entrypoint.sh @@ -8,6 +8,8 @@ WS_PATH=$RUNNER_WORKSPACE/$REPO_NAME # set CI jobs directory variable to easily move it CI_JOBS_DIR=.github/jobs +PYTESTS_GROUPS_FILEPATH=.github/parm/pytest_groups.txt + source ${GITHUB_WORKSPACE}/${CI_JOBS_DIR}/bash_functions.sh # get branch name for push or pull request events @@ -30,10 +32,8 @@ if [ $? != 0 ]; then ${GITHUB_WORKSPACE}/${CI_JOBS_DIR}/docker_setup.sh fi -# # running unit tests (pytests) -# -if [ "$INPUT_CATEGORIES" == "pytests" ]; then +if [[ "$INPUT_CATEGORIES" == pytests* ]]; then export METPLUS_ENV_TAG="pytest" export METPLUS_IMG_TAG=${branch_name} echo METPLUS_ENV_TAG=${METPLUS_ENV_TAG} @@ -56,14 +56,20 @@ if [ "$INPUT_CATEGORIES" == "pytests" ]; then . echo Running Pytests - command="export METPLUS_PYTEST_HOST=docker; cd internal_tests/pytests; /usr/local/envs/pytest/bin/pytest -vv --cov=../../metplus" + command="export METPLUS_PYTEST_HOST=docker; cd internal_tests/pytests;" + command+="status=0;" + for x in `cat $PYTESTS_GROUPS_FILEPATH`; do + marker="${x//_or_/ or }" + marker="${marker//not_/not }" + command+="/usr/local/envs/pytest/bin/pytest -vv --cov=../../metplus -m \"$marker\"" + command+=";if [ \$? != 0 ]; then status=1; fi;" + done + command+="if [ \$status != 0 ]; then echo ERROR: Some pytests failed. Search for FAILED to review; false; fi" time_command docker run -v $WS_PATH:$GITHUB_WORKSPACE --workdir $GITHUB_WORKSPACE $RUN_TAG bash -c "$command" exit $? fi -# # running use case tests -# # split apart use case category and subset list from input CATEGORIES=`echo $INPUT_CATEGORIES | awk -F: '{print $1}'` diff --git a/.github/jobs/free_disk_space.sh b/.github/jobs/free_disk_space.sh new file mode 100755 index 0000000000..cfe30cf06d --- /dev/null +++ b/.github/jobs/free_disk_space.sh @@ -0,0 +1,15 @@ +#! /bin/bash + +echo Checking disk usage before cleanup +df -h + +printf "\nRemoving files as suggested by https://github.com/actions/virtual-environments/issues/2840" + +sudo rm -rf /usr/share/dotnet +sudo rm -rf /opt/ghc +sudo rm -rf "/usr/local/share/boost" +sudo rm -rf "$AGENT_TOOLSDIRECTORY" + +printf "\nChecking disk usage after cleanup" + +df -h diff --git a/.github/jobs/get_metviewer.sh b/.github/jobs/get_metviewer.sh index b20cdde333..2cf43010e4 100755 --- a/.github/jobs/get_metviewer.sh +++ b/.github/jobs/get_metviewer.sh @@ -21,10 +21,10 @@ sleep 20 # print list of currently running containers to # verify mysql and metviewer are running docker ps -a - +# TODO: when METviewer Dockerfile changes METdatadb to METdataio, update path to sql file accordingly # commands to run inside METviewer container cmd="mysql -hmysql_mv -uroot -pmvuser -e\"create database mv_metplus_test;\";" -cmd+="mysql -hmysql_mv -uroot -pmvuser mv_metplus_test < /METviewer/sql/mv_mysql.sql" +cmd+="mysql -hmysql_mv -uroot -pmvuser mv_metplus_test < /METviewer-python/METdataio/METdbLoad/sql/mv_mysql.sql" cmd+=";mysql -hmysql_mv -uroot -pmvuser -e\"show databases;\"" # execute commands inside metviewer container to create database diff --git a/.github/jobs/get_use_case_commands.py b/.github/jobs/get_use_case_commands.py index 63e86ce21e..debf7bc6bf 100755 --- a/.github/jobs/get_use_case_commands.py +++ b/.github/jobs/get_use_case_commands.py @@ -72,13 +72,13 @@ def handle_automation_env(host_name, reqs, work_dir): 'cd -;' ) - # if metdatadb is in requirements list, add command to obtain METdatadb - if 'metdatadb' in str(reqs).lower(): + # if metdataio is in requirements list, add command to obtain METdataio + if 'metdataio' in str(reqs).lower(): setup_env += ( f'cd {METPLUS_DOCKER_LOC};' f'{work_dir}/manage_externals/checkout_externals' - f' -e {work_dir}/.github/parm/Externals_metdatadb.cfg;' - f'{python_path} -m pip install {METPLUS_DOCKER_LOC}/../METdatadb;' + f' -e {work_dir}/.github/parm/Externals_metdataio.cfg;' + f'{python_path} -m pip install {METPLUS_DOCKER_LOC}/../METdataio;' 'cd -;' ) diff --git a/.github/jobs/get_use_cases_to_run.sh b/.github/jobs/get_use_cases_to_run.sh index 39c250474c..341d1c4801 100755 --- a/.github/jobs/get_use_cases_to_run.sh +++ b/.github/jobs/get_use_cases_to_run.sh @@ -1,6 +1,7 @@ #! /bin/bash use_case_groups_filepath=.github/parm/use_case_groups.json + # set matrix to string of an empty array in case no use cases will be run matrix="[]" @@ -31,12 +32,14 @@ fi if [ "$run_unit_tests" == "true" ]; then echo Adding unit tests to list to run + pytests="\"pytests\"," + # if matrix is empty, set to an array that only includes pytests if [ "$matrix" == "[]" ]; then - matrix="[\"pytests\"]" + matrix="[${pytests:0: -1}]" # otherwise prepend item to list else - matrix="[\"pytests\", ${matrix:1}" + matrix="[${pytests}${matrix:1}" fi fi diff --git a/.github/jobs/run_difference_tests.sh b/.github/jobs/run_difference_tests.sh index d363b673d5..609fa570e7 100755 --- a/.github/jobs/run_difference_tests.sh +++ b/.github/jobs/run_difference_tests.sh @@ -17,7 +17,7 @@ if [ "$( ls -A ${RUNNER_WORKSPACE}/diff)" ]; then echo ::set-output name=upload_diff::true mkdir -p artifact/diff-${artifact_name} cp -r ${RUNNER_WORKSPACE}/diff/* artifact/diff-${artifact_name} - exit 1 + exit 2 fi echo ::set-output name=upload_diff::false diff --git a/.github/parm/Externals_metdatadb.cfg b/.github/parm/Externals_metdataio.cfg similarity index 59% rename from .github/parm/Externals_metdatadb.cfg rename to .github/parm/Externals_metdataio.cfg index 888d20303c..59a20286bc 100644 --- a/.github/parm/Externals_metdatadb.cfg +++ b/.github/parm/Externals_metdataio.cfg @@ -1,8 +1,8 @@ [METdatadb] -local_path = ../METdatadb +local_path = ../METdataio protocol = git required = True -repo_url = https://github.com/dtcenter/METdatadb +repo_url = https://github.com/dtcenter/METdataio branch = develop [externals_description] diff --git a/.github/parm/pytest_groups.txt b/.github/parm/pytest_groups.txt new file mode 100644 index 0000000000..374b99da80 --- /dev/null +++ b/.github/parm/pytest_groups.txt @@ -0,0 +1,6 @@ +util +wrapper +wrapper_a +wrapper_b +wrapper_c +plotting_or_long diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 9a9a0627bc..2a4da1ef67 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -25,32 +25,32 @@ "run": false }, { - "category": "convection_allowing_models", + "category": "short_range", "index_list": "0", "run": false }, { - "category": "convection_allowing_models", + "category": "short_range", "index_list": "1", "run": false }, { - "category": "convection_allowing_models", + "category": "short_range", "index_list": "2-6", "run": false }, { - "category": "convection_allowing_models", + "category": "short_range", "index_list": "7", "run": false }, { - "category": "convection_allowing_models", + "category": "short_range", "index_list": "8", "run": false }, { - "category": "convection_allowing_models", + "category": "short_range", "index_list": "9", "run": false }, @@ -136,47 +136,52 @@ }, { "category": "s2s", - "index_list": "1-3", + "index_list": "1", "run": false }, { "category": "s2s", - "index_list": "4", + "index_list": "2", "run": false }, { "category": "s2s", - "index_list": "5", + "index_list": "3", "run": false }, { "category": "s2s", - "index_list": "6-7", + "index_list": "4", "run": false }, { "category": "s2s", - "index_list": "7-9", + "index_list": "5", "run": false }, { "category": "s2s", - "index_list": "10", + "index_list": "6", "run": false }, { - "category": "s2s", - "index_list": "11", + "category": "s2s_mid_lat", + "index_list": "0-2", "run": false }, { - "category": "s2s", - "index_list": "12", - "run": false + "category": "s2s_mid_lat", + "index_list": "3", + "run": false }, { - "category": "s2s", - "index_list": "13", + "category": "s2s_mjo", + "index_list": "0-2", + "run": false + }, + { + "category": "s2s_mjo", + "index_list": "3", "run": false }, { diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1b47909874..b156497b06 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -117,6 +117,9 @@ jobs: - uses: actions/checkout@v2 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Create directories for database run: .github/jobs/create_dirs_for_database.sh @@ -139,24 +142,24 @@ jobs: # copy logs with errors to error_logs directory to save as artifact - name: Save error logs id: save-errors - if: ${{ always() && steps.run_tests.conclusion == 'failure' && matrix.categories != 'pytests' }} + if: ${{ always() && steps.run_tests.conclusion == 'failure' && !startsWith(matrix.categories,'pytests') }} run: .github/jobs/save_error_logs.sh # run difference testing - name: Run difference tests id: run-diff - if: ${{ needs.job_control.outputs.run_diff == 'true' && steps.run_tests.conclusion == 'success' && matrix.categories != 'pytests' }} + if: ${{ needs.job_control.outputs.run_diff == 'true' && steps.run_tests.conclusion == 'success' && !startsWith(matrix.categories,'pytests') }} run: .github/jobs/run_difference_tests.sh ${{ matrix.categories }} ${{ steps.get-artifact-name.outputs.artifact_name }} # copy output data to save as artifact - name: Save output data id: save-output - if: ${{ always() && steps.run_tests.conclusion != 'skipped' && matrix.categories != 'pytests' }} + if: ${{ always() && steps.run_tests.conclusion != 'skipped' && !startsWith(matrix.categories,'pytests') }} run: .github/jobs/copy_output_to_artifact.sh ${{ steps.get-artifact-name.outputs.artifact_name }} - name: Upload output data artifact uses: actions/upload-artifact@v2 - if: ${{ always() && steps.run_tests.conclusion != 'skipped' && matrix.categories != 'pytests' }} + if: ${{ always() && steps.run_tests.conclusion != 'skipped' && !startsWith(matrix.categories,'pytests') }} with: name: ${{ steps.get-artifact-name.outputs.artifact_name }} path: artifact/${{ steps.get-artifact-name.outputs.artifact_name }} diff --git a/docs/Contributors_Guide/add_use_case.rst b/docs/Contributors_Guide/add_use_case.rst index 58f8f7a8ef..c7ac6560cd 100644 --- a/docs/Contributors_Guide/add_use_case.rst +++ b/docs/Contributors_Guide/add_use_case.rst @@ -33,16 +33,15 @@ Use Case Categories =================== New MET tool wrapper use cases will be put in the repository under -parm/use_cases/met_tool_wrapper/ where +*parm/use_cases/met_tool_wrapper/* where ** is the name of the MET tool being wrapped. New model applications use cases will be put in the repository under -parm/use_cases/model_applications/ where is +*parm/use_cases/model_applications/* where ** is one of the following: * air_quality_and_comp * climate -* convection_allowing_models * data_assimilation * extremes * land_surface @@ -52,12 +51,15 @@ one of the following: * pbl * precipitation * s2s (Subseasonal to Seasonal) +* s2s_mid_lat (Subseasonal to Seasonal: Mid-Latitude) +* s2s_mjo (Subseasonal to Seasonal: Madden-Julian Oscillation) +* short_range (formerly convection_allowing_models) * space_weather -* tc_and_extra_tc (Tropcial Cyclone and Extra Tropical Cyclone) +* tc_and_extra_tc (Tropical Cyclone and Extratropical Cyclone) -If you feel that the new use case does not fall into any of these categories -or are unsure which category is the most appropriate, please create a post in -the +If the new use case does not fall into any of these categories +or it is unclear which category is the most appropriate, +please create a post in the `METplus GitHub Discussions Forum `_. Use Case Content @@ -67,36 +69,37 @@ Configure New Use Case ---------------------- If creating a new MET tool wrapper use case, in the MET tool name -sub-directory (parm/use_cases/met_tool_wrapper/), each +sub-directory (*parm/use_cases/met_tool_wrapper/*), each use case should have the following: * A METplus configuration file where the MET tool name follows PascalCase, - e.g. GridStat.conf or ASCII2NC.conf. + e.g. **GridStat.conf** or **ASCII2NC.conf**. If the use case uses a Python embedding script, it should be indicated by adding "_python_embedding" to the MET tool name. - e.g. GridStat_python_embedding.conf + e.g. **GridStat_python_embedding.conf**. If creating a new model applications use case, in the category sub-directory -(parm/use_cases/model_applications/), each use case should have the +(*parm/use_cases/model_applications/*), each use case should have the following: * A METplus configuration file named - \_fcst\_obs\_cilmo\\.conf where + *\_fcst\_obs\_cilmo\\.conf* + where - * **** is the MET tool that performs the primary statistical - analysis, i.e. GridStat or SeriesAnalysis + * ** is the MET tool that performs the primary statistical + analysis, i.e. GridStat or SeriesAnalysis. - * **** is the name of the forecast input data source (this can be - excluded if no forecast data is used) + * ** is the name of the forecast input data source (this can be + excluded if no forecast data is used). - * **** is the name of the observation input data source (this can be - excluded if no observation data is used) + * ** is the name of the observation input data source (this can be + excluded if no observation data is used). - * **** is the optional climotology input data source (this can be - excluded if no climatology data is used) + * ** is the optional climatology input data source (this can be + excluded if no climatology data is used). - * **** is an optional description that can include field - category, number of fields, statistical types, and file formats + * ** is an optional description that can include field + category, number of fields, statistical types, and file formats. If the use case uses a Python Embedding script or any other additional files (besides input data), then put them in a sub-directory that matches the METplus @@ -111,7 +114,7 @@ Use Case Rules - The name of the use case files should conform to the guidelines listed above in Use Case Content. -- The use case METplus configuration file should not **set** any variables that +- The use case METplus configuration file should not **set** any variables specific to the user's environment, such as INPUT_BASE, OUTPUT_BASE, and PARM_BASE, METPLUS_CONF, etc. - A limited number of run times should be processed so that they use case runs @@ -123,8 +126,8 @@ Use Case Rules - All data that is input to the use case (not generated by METplus) should be referenced relative to {INPUT_BASE} and the directory structure of the use case. For example, if adding a new model application use case found under - model_applications/precipitation, the input directory should be relative to - {INPUT_BASE}/model_applications/precipitation:: + *model_applications/precipitation*, the input directory should be relative to + *{INPUT_BASE}/model_applications/precipitation*:: FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/precipitation @@ -138,8 +141,8 @@ Use Case Rules - The Sphinx documentation file should be as complete as possible, listing as much relevant information about the use case as possible. Keyword tags should be used so that users can locate other use cases that exhibit common - functionality/data sources/tools/etc. If a new keyword is used, it should be - added to the Quick Search Guide (docs/Users_Guide/quicksearch.rst). More + *functionality/data sources/tools/etc*. If a new keyword is used, it should + be added to the Quick Search Guide (*docs/Users_Guide/quicksearch.rst*). More information can be found :ref:`here `. - The use case should be run by someone other than the author to ensure that it runs smoothly outside of the development environment set up by the author. @@ -149,12 +152,12 @@ Use Case Rules Use Cases That Exceed Github Actions Memory Limit ------------------------------------------------- -Below is a list of use cases in the repository that cannot be run in Github Actions -due to their excessive memory usage. They have been tested and cleared by reviewers -of any other issues and can be used by METplus users in the same manner as all -other use cases. +Below is a list of use cases in the repository that cannot be run in Github +Actions due to their excessive memory usage. They have been tested and +cleared by reviewers of any other issues and can be used by METplus users in +the same manner as all other use cases. -- model_applications/marine_and_cryosphere/GridStat_fcstRTOFS_obsGHRSST_climWOA_sst +- *model_applications/marine_and_cryosphere/GridStat_fcstRTOFS_obsGHRSST_climWOA_sst* .. _use_case_documentation: @@ -164,20 +167,20 @@ Document New Use Case Create a New Model Applications Docs Directory ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**If the use case falls under an existing Model Applications category, you can +**If the use case falls under an existing Model Applications category, skip this section.** If the use case is the first in a new Model Applications category, create the -directory under **docs**/use_cases/model_applications if it does not already -exist. Inside this directory, create a file called README.rst. Inside this file -add the following each on a single line: +directory under **docs**/*use_cases/model_applications* if it does not already +exist. Inside this directory, create a file called **README.rst**. +Inside this file add the following each on a single line: * Title of category -* Dashes (-) that are the exact same lengh as the title +* Dashes (-) that are the exact same length as the title * A short description of the category For example, -docs/use_cases/model_applications/**air_quality_and_comp/README.rst** +*docs/use_cases/model_applications*/**air_quality_and_comp/README.rst** would look something like this:: Air Quality and Composition @@ -193,9 +196,9 @@ Add Sphinx Documentation File ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In the corresponding documentation MET tool name directory -(**docs**/use_cases/met_tool_wrapper/) for a met_tool_wrappers +(**docs**/*use_cases/met_tool_wrapper/*) for a met_tool_wrappers use case OR category directory for a model_applications use case -(**docs**/use_cases/model_applications/), add: +(**docs**/*use_cases/model_applications/*), add: * A Python Sphinx Documentation (.py) file with the same name as the METplus configuration file @@ -230,10 +233,11 @@ use case OR category directory for a model_applications use case https://metplus.readthedocs.io/en/latest/search.html?q=**ASCII2NCToolUseCase**. * Add an image to use as the thumbnail (if desired). Images can be added - to the docs/_static directory and should be named -.png + to the *docs/_static* directory and should be named + -.png where is the use case category and is the name of the configuration file, i.e. - air_quality_and_comp-EnsembleStat_fcstICAP_obsMODIS_aod.png. + **air_quality_and_comp-EnsembleStat_fcstICAP_obsMODIS_aod.png.** The image can be referenced in the documentation file with this syntax: :: @@ -248,12 +252,12 @@ use case OR category directory for a model_applications use case Accessing the Documentation --------------------------- -It is important to ensure that the new use case files is displayed and the +It is important to ensure that the new use case files are displayed and the formatting looks correct. Prior to the release of METplus v4.0.0 contributors were required to build the documentation manually. However, the METplus components now use Read the Docs to build and display the documentation. For more information on how to view the newly added use case, see the -:ref:`Read the Docs METplus Documenation `. Contributors can +:ref:`Read the Docs METplus Documentation `. Contributors can still build the documentation manually if desired. See the :ref:`Build the Documentation Manually ` section below for more information. @@ -278,10 +282,10 @@ or conda activate /home/met_test/.conda/envs/sphinx_env .. note:: - If conda is not already in your path, you will have to find it and run it - from the full path. + If conda is not already in PATH, find it and run it + with the full path. -or you can create your own conda environment and install the packages:: +Or create a conda environment and install the packages:: conda create --name sphinx_env python=3.6 conda activate sphinx_env @@ -290,14 +294,16 @@ or you can create your own conda environment and install the packages:: pip install git+https://github.com/ESMCI/sphinx_rtd_theme@version-dropdown-with-fixes .. note:: - The specific version of sphinx_rtd_theme is needed to build the documentation - with the version selector. If you are building the docs locally, you don't - necessarily need this version. If it is easier, you can run 'conda install - sphinx_rtd_theme' instead of the pip from git command to install the package + The specific version of sphinx_rtd_theme is needed to build the + documentation with the version selector. + If the docs are being built locally, this version is not + necessarily needed. If it is easier, run 'conda install + sphinx_rtd_theme' instead of the pip from git command + to install the package. -To build the docs, run the build_docs.py script from the docs directory. Make -sure your conda environment is activated or the required packages are available -in your Python 3 environment:: +To build the docs, run the **build_docs.py** script from the docs directory. +Make sure the conda environment is activated or the required packages +are available in the Python3 environment:: cd ~/METplus/docs ./build_docs.py @@ -308,9 +314,9 @@ Input Data ========== Sample input data needed to run the use case should be provided. Please try to -limit your input data to the minimum that is -needed to demonstrate your use case effectively. GRIB2 files can be pared down -to only contain the fields and/or vertical levels that are needed using +limit the input data to the minimum that is +needed to demonstrate the use case effectively. GRIB2 files can be pared down +to only contain the fields and/or vertical levels that are needed for using `wgrib2 `_. Example: To create a file called subset.grib2 that only contains TMP data from @@ -325,19 +331,20 @@ the file(s). Providing new data ------------------ -Log into the computer where your input data resides -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Log into the computer where the input data resides +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Switch to Bash ^^^^^^^^^^^^^^ -If you are using a shell other than bash, run "bash" to activate a bash -shell. This will make the instructions you need to run on the DTC web server -as the met_test user easier because met_test's default shell is bash:: +Run "bash" to activate a bash shell. This step isn't necessary if bash +is already the default shell. The met_test user's default shell is bash. +The instructions needed to run +on the DTC web server will run smoothly in bash: bash -If you are unsure which shell you use, run the following command:: +Run the following command to see which shell is currently in use:: echo $SHELL @@ -346,15 +353,15 @@ If you are unsure which shell you use, run the following command:: running these instructions easier. Make sure they are set to the correct values that correspond to the use case being added before copy/pasting any of these commands or there may be unintended consequences. - Copy and paste these values after you have modified them into a text file - that you can copy and paste into the terminal. + Copy and paste these values after they have been modified into a text file + that can be copied and pasted into the terminal. Download the template environment file ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This file is available on the DTC web server. You can use wget to download the -file to your current working directory, or visit the URL in a browser and save -it to your computer:: +This file is available on the DTC web server. Use 'wget' to download the +file to the current working directory, or visit the URL in a browser and save +it on the computer:: wget https://dtcenter.ucar.edu/dfiles/code/METplus/METplus_Data/add_use_case_env.bash @@ -363,7 +370,7 @@ Or click this `link / where - is the value you set for ${METPLUS_USE_CASE_CATEGORY} and - is the value you set for ${METPLUS_USE_CASE_NAME}. For a new -met_tool_wrapper use case, use {INPUT_BASE}/met_test/new. -You can set {INPUT_BASE} to your local directory to test that the use case +i.e *{INPUT_BASE}/model_applications//* where + is the value that has been set for ${METPLUS_USE_CASE_CATEGORY} and + is the value that has been set for ${METPLUS_USE_CASE_NAME}. +For a new met_tool_wrapper use case, use *{INPUT_BASE}/met_test/new*. +Set {INPUT_BASE} to the local directory to test that the use case still runs properly. Create new data tarfile ^^^^^^^^^^^^^^^^^^^^^^^ -Create a tarfile on your development machine with the new dataset. Make sure +Create a tarfile on the development machine with the new dataset. Make sure the tarfile contains directories, i.e. -model_applications/${METPLUS_USE_CASE_CATEGORY}:: +*model_applications/${METPLUS_USE_CASE_CATEGORY}*:: tar czf ${METPLUS_NEW_DATA_TARFILE} model_applications/${METPLUS_USE_CASE_CATEGORY}/${METPLUS_USE_CASE_NAME} @@ -455,7 +462,7 @@ Verify that the correct directory structure is found inside the tarfile:: tar tzf ${METPLUS_NEW_DATA_TARFILE} The output should show that all of the data is found under the -model_applications// directory. For example:: +*model_applications//* directory. For example:: model_applications/marine_and_cryosphere/ model_applications/marine_and_cryosphere/PlotDataPlane_obsHYCOM_coordTripolar/ @@ -474,7 +481,8 @@ the environment file to the staging directory: scp ${METPLUS_NEW_DATA_TARFILE} |dtc_web_server|:|metplus_staging_dir|/ scp ${METPLUS_USER_ENV_FILE} |dtc_web_server|:|metplus_staging_dir|/ -If you do not, upload the files to the RAL FTP:: +If you do not have access to the internal DTC web server, +upload the files to the RAL FTP server:: ftp -p ftp.rap.ucar.edu @@ -485,19 +493,20 @@ For an example on how to upload data to the ftp site see Adding new data to full sample data tarfile ------------------------------------------- -If you are unable to access the DTC web server to upload data or if you do -not have permission to use the met_test shared user account, someone from the +If you are unable to access the DTC web server to upload data or if +permission has not been granted to use the met_test shared user +account, someone from the METplus development team will have to complete the instructions in this -section. Please let one of the team members know if this is the case. +section. Please let one of the team members know if this is necessary. Comment on the GitHub issue associated with this use case and/or email the team -member(s) you have been coordinating with for this work. If you are unsure who -to contact, then please create a post in the +member(s) that have been coordinating with this work. If it is unclear who to +contact, please create a post in the `METplus GitHub Discussions Forum `_. Log into the DTC Web Server with SSH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The web server is only accessible if you are on the NCAR VPN. +The web server is only accessible on the NCAR VPN. .. parsed-literal:: @@ -517,7 +526,7 @@ Setup the environment to run commands on web server ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change directory to the data staging dir, -source the environment file you created, and make sure the environment +source the environment file that was created, and make sure the environment variables are set properly. .. parsed-literal:: @@ -562,23 +571,26 @@ or develop directories. Add contents of existing tarfile to feature branch directory (if applicable) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO YOUR USE CASE. READ CAREFULLY!** +**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO THE USE CASE. READ CAREFULLY!** -**CONDITION 1: IF you have determined that there is an existing tarfile +**CONDITION 1: If there is an existing tarfile for the category (from the previous step)**, then untar the sample data tarball into the feature branch directory:: tar zxf ${METPLUS_EXISTING_DATA_TARFILE} -C ${METPLUS_DATA_TARFILE_DIR}/${METPLUS_FEATURE_BRANCH} -**CONDITION 2: If no tarfile exists yet, you can skip this step** +**CONDITION 2: If no tarfile exists yet, skip this step.** Rename or modify existing data or data structure (if applicable) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**If the reason for your feature branch is to adjust an existing use case, such as renaming a use case -or changing the data file,** then adjust the directory structure and/or the data files which should now -be in your feature branch directory (from your last step). Changes to a use case name or input data for -a preexisting use case should be separately verified to run successfully, and noted in the Pull Request form +**If the reason for the feature branch is to adjust an existing use case, +such as renaming a use case or changing the data file, then adjust the +directory structure and/or the data files which should now be in the +feature branch directory (from the last step).** Changes to a +use case name or input data for +a pre-existing use case should be separately verified to run successfully, +and noted in the Pull Request form (described later). Add new data to feature branch directory @@ -589,13 +601,13 @@ Untar the new data tarball into the feature branch directory:: tar zxf ${METPLUS_DATA_STAGING_DIR}/${METPLUS_NEW_DATA_TARFILE} -C ${METPLUS_DATA_TARFILE_DIR}/${METPLUS_FEATURE_BRANCH} Verify that all of the old and new data exists in the directory that was -created (i.e. model_applications/). +created (i.e. *model_applications/*). Create the new tarfile ^^^^^^^^^^^^^^^^^^^^^^ Create the new sample data tarball. -**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO YOUR USE CASE. READ CAREFULLY!** +**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO THE USE CASE. READ CAREFULLY!** **CONDITION 1:** Model Application Use Case Example:: @@ -626,14 +638,14 @@ created and tested. Trigger Input Data Ingest ------------------------- -If working in the dtcenter/METplus repository, please skip this step. +If working in the *dtcenter/METplus repository*, please skip this step. If working in a forked METplus repository, the newly added input data will not become available for the tests unless it is triggered from the dtcenter repository. A METplus developer will need to run the following steps. Please -provide them with the name of your forked repository and the branch that will +provide them with the name of the forked repository and the branch that will be used to create the pull request with the new use case. In this example, -the branch feature_XYZ exists in the my_fake_user/METplus repository. First, -clone the dtcenter/METplus repository, the run the following:: +the branch feature_XYZ exists in the *my_fake_user/METplus* repository. First, +clone the *dtcenter/METplus* repository, the run the following:: git remote add my_fake_user https://github.com/my_fake_user/METplus git checkout develop @@ -645,17 +657,18 @@ clone the dtcenter/METplus repository, the run the following:: These commands will add a new remote to the forked repository, create a branch off of the develop branch with the same name as the branch on the fork, pull in the changes from the forked branch, then push the new branch up to -dtcenter/METplus on GitHub. Finally, the remote is removed to avoid clutter. +*dtcenter/METplus* on GitHub. Finally, the remote is removed to avoid clutter. -Once these steps have been completed, go to dtcenter/METplus on GitHub in a web -browser and navigate to the +Once these steps have been completed, go to *dtcenter/METplus* on GitHub +in a web browser and navigate to the `Actions tab `_. Click on the job named "Docker Setup - Update Data Volumes" then click on "Update Data Volumes" and verify that the new data tarfile was found on the DTC web server and the new Docker data volume was created successfully. See :ref:`verify-new-input-data-was-found`. If the input data was ingested -properly, then delete the feature branch from dtcenter/METplus. This will avoid +properly, then delete the feature branch from *dtcenter/METplus*. +This will avoid confusion if this branch diverges from the branch on the forked repository that will be used in the final pull request. @@ -664,7 +677,7 @@ will be used in the final pull request. Add use case to the test suite ------------------------------ -The **internal_tests/use_cases/all_use_cases.txt** file in the METplus +The *internal_tests/use_cases/all_use_cases.txt* file in the METplus repository contains the list of all use cases. Add the new use case to this file so it will be available in the tests. See the :ref:`cg-ci-all-use-cases` section for details. @@ -674,7 +687,7 @@ the tests. See the :ref:`cg-ci-all-use-cases` section for details. Add new category to test runs ----------------------------- -The **.github/parm/use_case_groups.json** file in the METplus repository +The *.github/parm/use_case_groups.json* file in the METplus repository contains a list of the use case groups to run together. Add a new entry to the list that includes the category of the new use case, the list of indices that correspond to the index number described in the @@ -703,7 +716,7 @@ with index 2 and is marked to "run" for every push. New use cases are added as a separate item to make reviewing the test results easier. A new use case will produce new output data that is not found in the -"truth" data set which is compared the output of the use case runs to check +"truth" data set which is compared to the output of the use case runs to check if code changes altered the final results. Isolating the new output will make it easier to verify that the only differences are caused by the new data. It also makes it easier to check the size of the output data and length of time @@ -717,12 +730,13 @@ All of the use cases in the METplus repository are run via GitHub Actions to ensure that everything runs smoothly. If the above instructions to add new data were followed correctly, then GitHub Actions will automatically obtain the -new data and use it for the tests when you push your changes to GitHub. -Adding the use case to the test suite will allow you to check that the data +new data and use it for the tests when the changes are pushed to GitHub. +Adding the use case to the test suite will allow the ability to check +that the data was uploaded correctly and that the use case runs in the Python environment created in Docker. The status of the tests can be viewed on GitHub under the `Actions tab `_. -Your feature branch should be found in the list of results near the top. +The feature branch should be found in the list of results near the top. At the far left of the entry will be a small status icon: - A yellow circle that is spinning indicates that the build is currently @@ -731,7 +745,7 @@ At the far left of the entry will be a small status icon: waiting to be run. - A green check mark indicates that all of the jobs ran successfully. - A red X indicates that something went wrong. -- A grey octagon with an exclamatory mark (!) inside means it was cancelled. +- A gray octagon with an exclamation mark (!) inside means it was canceled. Click on the text next to the icon (last commit message) to see more details. @@ -748,7 +762,7 @@ Click on the job titled "Docker Setup - Update Data Volumes" On this page, click the item labeled "Update Data Volumes" to view the log output. If the new data was found properly, there will be output saying "Will pull data from..." followed by the path to the feature branch directory. -It will also list the dataset category that will be added +It will also list the dataset category that will be added. .. figure:: figure/data_volume_pull.png @@ -772,28 +786,34 @@ for assistance. Verify that the use case ran successfully ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -You should verify that the use case was +Please verify that the use case was actually run by referring to the appropriate section under "Jobs" that starts with "Use Case Tests." Click on the job and search for the use case config filename in the log output by using the search box on the top right of the log output. -If the use case fails in GitHub Actions but runs successfully in the user's environment, -potential reasons include: +If the use case fails in GitHub Actions but runs successfully in the user's +environment, potential reasons include: - Errors providing input data (see :ref:`use_case_input_data`) - Using hard-coded paths from the user's machine -- Referencing variables set in the user's configuration file or local environment -- Memory usuage of the use case exceeds the available memory in hte Github Actions environment - -Github Actions has `limited memory `_ -available and will cause the use case to fail when exceeded. A failure caused by exceeding -the memory allocation in a Python Embedding script may result in an unclear error message. -If you suspect that this is the case, consider utilizing a Python memory profiler to check the -Python script's memory usage. If your use case exceeds the limit, try to pare +- Referencing variables set in the user's configuration file or local + environment +- Memory usage of the use case exceeds the available memory in the + Github Actions environment + +Github Actions has +`limited memory `_ +available and will cause the use case to fail when exceeded. A failure +caused by exceeding the memory allocation in a Python Embedding script +may result in an unclear error message. +If it is suspected that this is the case, consider utilizing a Python +memory profiler to check the +Python script's memory usage. If the use case exceeds the limit, try to pare down the data held in memory and use less memory intensive Python routines. -If memory mitigation cannot move the use case’s memory usage below the Github Actions limit, +If memory mitigation cannot move the use case’s memory usage below the +Github Actions limit, see :ref:`exceeded-Github-Actions` for next steps. Verify that the use case ran in a reasonable amount of time @@ -825,18 +845,18 @@ steps were unsuccessful in lowering memory usage, please take the following step Utilize a Python memory profiler to identify as specifically as possible where the script exceeds the memory limit. - Add the use case to the :ref:`memory-intense-use-cases` list. -- In the internal_tests/use_cases/all_use_cases.txt file, ensure that the +- In the *internal_tests/use_cases/all_use_cases.txt* file, ensure that the use case is listed as the lowest-listed use case in its respective category. - Change the number in front of the new use case to an 'X', preceeded + Change the number in front of the new use case to an 'X', preceded by the ‘#’ character:: #X::GridStat_fcstRTOFS_obsGHRSST_climWOA_sst::model_applications/marine_and_cryosphere/GridStat_fcstRTOFS_obsGHRSST_climWOA_sst.conf, model_applications/marine_and_cryosphere/GridStat_fcstRTOFS_obsGHRSST_climWOA_sst/ci_overrides.conf:: icecover_env, py_embed -- In the **.github/parm/use_case_groups.json** file, remove the entry that +- In the *.github/parm/use_case_groups.json* file, remove the entry that was added during the :ref:`add_new_category_to_test_runs` for the new use case. This will stop the use case from running on a pull request. -- Push these two updated files to your branch in Github and confirm that it - now compiles successfully. +- Push these two updated files to the working branch in Github and + confirm that it now compiles successfully. - During the :ref:`create-a-pull-request` creation, inform the reviewer of the Github Actions failure. The reviewer should confirm the use case is successful when run manually, that the memory profiler output confirms that @@ -848,10 +868,13 @@ steps were unsuccessful in lowering memory usage, please take the following step Create a Pull Request ===================== -Create a pull request to merge the changes from your branch into the develop +Create a pull request to merge the changes from the working branch +into the develop branch. More information on this process can be found in the -:ref:`GitHub Workflow ` chapter under -"Open a pull request using your browser." +:ref:`GitHub Workflow ` +chapter under +:ref:`Open a pull request using a browser `. + Pull Request Reviewer Instructions ================================== @@ -864,17 +887,11 @@ was run successfully using the new data, they will need to update the links on the DTC web server before the pull request is merged so that the develop branch will contain the new data. -.. warning:: - Check if there are multiple feature branch directories that have data for - the same model_applications category. If there are more than one, then - you will need to be careful not to overwrite the final tarfile so that - one or more of the new data files are lost! These instructions need - to be updated to handle this situation. Log into the DTC Web Server with SSH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The web server is only accessible if you are on the NCAR VPN. +The web server is only accessible on the NCAR VPN. .. parsed-literal:: @@ -906,7 +923,7 @@ Compare the feature branch file to the upcoming METplus version directory file:: diff ${METPLUS_FEATURE_BRANCH}/volume_mount_directories v${METPLUS_VERSION}/volume_mount_directories -**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO YOUR USE CASE. READ CAREFULLY!** +**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO THE USE CASE. READ CAREFULLY!** **CONDITION 1: IF there is a new entry or change in the feature version**, copy the feature file into the upcoming METplus version directory and the develop directory:: @@ -919,7 +936,7 @@ Copy data from the feature directory into the next version directory **Make sure the paths are correct before copying.** -**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO YOUR USE CASE. READ CAREFULLY!** +**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO THE USE CASE. READ CAREFULLY!** **CONDITION 1:** Model Applications Use Cases:: @@ -943,7 +960,7 @@ Copy data from the feature directory into the next version directory echo $to_directory ls $to_directory -Once you have verified the correct directories are set, copy the files:: +After verifying the directories are correct, copy the files:: cp -r $from_directory $to_directory/ @@ -952,7 +969,7 @@ List the tarfile for the use case category in the next release version directory cd ${METPLUS_DATA_TARFILE_DIR}/v${METPLUS_VERSION} ls -lh sample_data-${METPLUS_USE_CASE_CATEGORY}* -**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO YOUR USE CASE. READ CAREFULLY!** +**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO THE USE CASE. READ CAREFULLY!** **CONDITION 1: IF the latest version of the tarfile is in this directory**, then rename the existing sample data tarball for @@ -962,7 +979,8 @@ the use case category just in case something goes wrong:: **OR** -**CONDITION 2: IF the sample data tarfile for the category is a link to another METplus +**CONDITION 2: IF the sample data tarfile for the category is a link to +another METplus version**, then simply remove the tarfile link:: unlink sample_data-${METPLUS_USE_CASE_CATEGORY}.tgz @@ -975,7 +993,7 @@ still needed. Create the new sample data tarfile. -**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO YOUR USE CASE. READ CAREFULLY!** +**ONLY RUN THE COMMAND THAT IS APPROPRIATE TO THE USE CASE. READ CAREFULLY!** **CONDITION 1:** Model Applications Use Cases:: @@ -1057,16 +1075,16 @@ The addition of a new use case results in new output data. When this happens, the reference branch needs to be updated so that future pull requests will compare their results to a "truth" data set that contains the new files. Create a pull request with "develop" as the source branch and "develop-ref" as -the destination branch. This is done so we can reference the pull request -number that is responsible for the changes in the truth data to easily track -where differences occurred. +the destination branch. This is done so that the pull request number +responsible for the changes in the truth data can be referenced to easily +track where differences occurred. -Merging develop into develop-ref often causes strange conflicts. We really -want to update develop-ref with the latest content of develop, so follow -these command line instructions in the METplus repository to reconcile the -conflicts before creating the pull request. +Merging develop into develop-ref often causes strange conflicts. It really is +necessary and important to update develop-ref with the latest content of +develop. Follow these command line instructions in the METplus repository to +reconcile the conflicts before creating the pull request. -* Reconcile conflicts between develop and develop-ref branches +* Reconcile conflicts between develop and develop-ref branches. :: @@ -1079,12 +1097,12 @@ conflicts before creating the pull request. * Next click `here `_ - and click the green "Create pull request" button to create the pull request + and click the green "Create pull request" button to create the pull request. .. figure:: figure/develop_into_develop-ref.png * Set the name of the pull request to "Update develop-ref after #XXXX" where - XXXX is the pull request number that introduced the differences + XXXX is the pull request number that introduced the differences. * Delete the template content and add the pull request number (formatted #XXXX) and a brief description of what has changed. The description is optional @@ -1092,7 +1110,7 @@ conflicts before creating the pull request. * Add the appropriate project and milestone values on the right hand side. -* Create the pull request +* Create the pull request. * Squash and merge the pull request. It is not necessary to wait for the automation checks to complete for this step. diff --git a/docs/Contributors_Guide/continuous_integration.rst b/docs/Contributors_Guide/continuous_integration.rst index 2ad3091b6b..e3fb5ccfe1 100644 --- a/docs/Contributors_Guide/continuous_integration.rst +++ b/docs/Contributors_Guide/continuous_integration.rst @@ -16,7 +16,7 @@ are pushed to GitHub. These tasks include: GitHub Actions Workflows ======================== -GitHub Actions runs workflows defined by files in the **.github/workflows** +GitHub Actions runs workflows defined by files in the *.github/workflows* directory of a GitHub repository. Files with the .yml suffix are parsed and GitHub Actions will trigger a workflow run if the triggering criteria is met. @@ -36,7 +36,6 @@ Many useful actions are provided by GitHub and external collaborators. Developers can also write their own custom actions to perform complex tasks to simplify a workflow. -**TODO Add screenshots** Testing (testing.yml) --------------------- @@ -81,7 +80,7 @@ at the bottom of the workflow summary page when the workflow has completed. Release Published (release_published.yml) - DEPRECATED ------------------------------------------------------ -**This workflow is no longer be required, as Slack now has GitHub integration +**This workflow is no longer required, as Slack now has GitHub integration to automatically create posts on certain events.** The workflow YAML file is still found in the repository for reference, but the workflow has been disabled via the Actions tab of the METplus GitHub webpage. @@ -101,7 +100,7 @@ Name ---- The name of a workflow can be specified to describe an overview of what is run. -The following line in the testing.yml file:: +The following line in the **testing.yml** file:: name: Testing @@ -167,9 +166,9 @@ Push This configuration tells GitHub Actions to trigger the workflow when changes are pushed to the repository and the following criteria are met: -* The branch is named **develop** or **develop-ref** -* The branch starts with **feature\_**, **main\_**, or **bugfix\_** -* Changes were made to at least one file that is not in the **docs** directory. +* The branch is named **develop** or **develop-ref**. +* The branch starts with **feature\_**, **main\_**, or **bugfix\_**. +* Changes were made to at least one file that is not in the *docs* directory. Pull Request ^^^^^^^^^^^^ @@ -185,7 +184,7 @@ This configuration tells GitHub Actions to trigger the workflow for pull requests in the repository and the following criteria are met: * The pull request was opened, reopened, or synchronized. -* Changes were made to at least one file that is not in the **docs** directory. +* Changes were made to at least one file that is not in the *docs* directory. The **synchronize** type triggers a workflow for every push to a branch that is included in an open pull request. @@ -224,10 +223,10 @@ to trigger this workflow. It lists the input values that are passed from the external repository. The inputs include: -* The repository that triggered the workflow, such as dtcenter/MET +* The repository that triggered the workflow, such as *dtcenter/MET* * The commit hash in the external repository that triggered the event * The reference (or branch) that triggered the event, such as - refs/heads/develop + *refs/heads/develop* * The GitHub username that triggered the event in the external repository (optional) @@ -238,7 +237,7 @@ develop branch. Future work is planned to support main_v* branches, which will involve using the 'ref' input to determine what to obtain in the workflow. -For example, changes pushed to dtcenter/MET main_v10.1 should trigger a +For example, changes pushed to *dtcenter/MET* main_v10.1 should trigger a testing workflow that runs on the METplus main_v4.1 branch. Jobs @@ -359,8 +358,10 @@ syntax:: ${{ steps.job_status.outputs.run_get_image }} The ID of the step is needed to reference the outputs for that step. -**Note that this notation should be referenced directly in the workflow YAML -file and not inside a script that is called by the workflow.** + +.. note:: + This notation should be referenced directly in the workflow YAML + file and not inside a script that is called by the workflow. To make the variable available to other jobs in the workflow, it will need to be set in the **outputs** section of the job:: @@ -393,12 +394,12 @@ On Push When a push event occurs the default behavior is to run the following: -* Create/Update the METplus Docker image -* Look for new input data -* Run unit tests -* Run any use cases marked to run (see :ref:`cg-ci-use-case-tests`) +* Create/Update the METplus Docker image. +* Look for new input data. +* Run unit tests. +* Run any use cases marked to run (see :ref:`cg-ci-use-case-tests`). -If the push is on the **develop** or a **main_vX.Y** branch, then all +If the push is on the *develop* or a *main_vX.Y* branch, then all of the use cases are run. Default behavior for push events can be overridden using @@ -407,8 +408,8 @@ Default behavior for push events can be overridden using On Pull Request """"""""""""""" -When a pull request is created into the **develop** branch or -a **main_vX.Y** branch, additional jobs are run in automation. +When a pull request is created into the *develop* branch or +a *main_vX.Y* branch, additional jobs are run in automation. In addition to the jobs run for a push, the scripts will: * Run all use cases @@ -419,13 +420,13 @@ In addition to the jobs run for a push, the scripts will: On Push to Reference Branch """"""""""""""""""""""""""" -Branches with a name that ends with **-ref** contain the state of the +Branches with a name that ends with *-ref* contain the state of the repository that will generate output that is considered "truth" data. In addition to the jobs run for a push, the scripts will: -* Run all use cases +* Run all use cases. * Create/Update Docker data volumes that store truth data with the use case - output + output. See :ref:`cg-ci-create-output-data-volumes` for more information. @@ -438,14 +439,14 @@ The automation logic reads the commit message for the last commit before a push. Keywords in the commit message can override the default behavior. Here is a list of the currently supported keywords and what they control: -* **ci-skip-all**: Don't run anything - skip all automation jobs -* **ci-skip-use-cases**: Don't run any use cases -* **ci-skip-unit-tests**: Don't run the Pytest unit tests -* **ci-run-all-cases**: Run all use cases +* **ci-skip-all**: Don't run anything - skip all automation jobs. +* **ci-skip-use-cases**: Don't run any use cases. +* **ci-skip-unit-tests**: Don't run the Pytest unit tests. +* **ci-run-all-cases**: Run all use cases. * **ci-run-diff**: Obtain truth data and run diffing logic for - use cases that are marked to run + use cases that are marked to run. * **ci-run-all-diff**: Obtain truth data and run diffing logic for - all use cases + all use cases. .. _cg-ci-get-image: @@ -475,7 +476,7 @@ This job calls the **docker_setup.sh** script. This script builds a METplus Docker image and pushes it to DockerHub. The image is pulled instead of built in each test job to save execution time. The script attempts to pull the appropriate Docker image from DockerHub -(dtcenter/metplus-dev:*BRANCH_NAME*) if it already exists so that unchanged +(*dtcenter/metplus-dev:BRANCH_NAME*) if it already exists so that unchanged components of the Docker image do not need to be rebuilt. This reduces the time it takes to rebuild the image for a given branch on a subsequent workflow run. @@ -498,7 +499,7 @@ i.e. METplotpy or METviewer, until a corresponding change is made to that component. If this occurs then some of the METplus use cases may break. To allow the tests to run successfully in the meantime, an option was added to force the version of the MET tag that is used to build the METplus Docker image -that is used for testing. In the testing.yml workflow file, +that is used for testing. In the **testing.yml** workflow file, there is a commented variable called MET_FORCE_TAG that can be uncommented and set to force the version of MET to use. This variable is found in the **get_image** job under the **env** section @@ -532,9 +533,9 @@ Create/Update Docker Data Volumes The METplus use case tests obtain input data from Docker data volumes. Each use case category that corresponds to a directory in -**parm/use_cases/model_applications** has its own data volume that contains +*parm/use_cases/model_applications* has its own data volume that contains all of the data needed to run those use cases. The MET Tool Wrapper use cases -found under **parm/use_cases/met_tool_wrapper** also have a data volume. +found under *parm/use_cases/met_tool_wrapper* also have a data volume. These data are made available on the DTC web server. This job utilizes the @@ -557,6 +558,38 @@ process can be found in the :ref:`use_case_input_data` section of the Add Use Cases chapter of the Contributor's Guide. +.. _cg-ci-unit-tests: + +Unit Tests +---------- + +Unit tests are run via pytest. +Groups of pytests are run in the 'pytests' job. +The list of groups that will be run in the automated tests are found in +.github/parm/pytest_groups.txt. +See :ref:`cg-unit-tests` for more information on pytest groups. + +Items in pytest_groups.txt can include:: + + * A single group marker name, i.e. wrapper_a + * Multiple group marker names separated by _or_, i.e. plotting_or_long + * A group marker name to exclude starting with not_, i.e. not_wrapper + +All pytest groups are currently run in a single GitHub Actions job. +This was done because the existing automation logic builds a Docker +environment to run the tests and each testing environment takes a few minutes +to create (future improvements may speed up execution time by running the +pytests directly in the GitHub Actions environment instead of Docker). +Running the pytests in smaller groups serially takes substantially less time +than calling all of the existing pytests in a single call to pytest, +so dividing tests into groups is recommended to improve performance. +Searching for the string "deselected in" in the pytests job log can be used +to see how long each group took to run. + +Future enhancements could be made to save and parse this information for each +run to output a summary at the end of the log file to more easily see which +groups could be broken up to improve performance. + .. _cg-ci-use-case-tests: Use Case Tests @@ -568,7 +601,7 @@ All Use Cases ^^^^^^^^^^^^^ All of the existing use cases are listed in **all_use_cases.txt**, -found in internal_tests/use_cases. +found in *internal_tests/use_cases*. The file is organized by use case category. Each category starts a line that following the format:: @@ -576,9 +609,10 @@ a line that following the format:: Category: where ** is the name of the use case category. -See :ref:`use_case_categories` for more information. If you are adding a -use case that will go into a new category, you will have to add a new category -definition line to this file and add your new use case under it. Each use case +See :ref:`use_case_categories` for more information. If a use case +is being added will go into a new category, +a new category definition line will have to be added +to this file and the new use case added under it. Each use case in that category will be found on its own line after this line. The use cases can be defined using the following formats:: @@ -592,7 +626,7 @@ The index is the number associated with the use case so it can be referenced easily. The first index number in a new category should be 0. Each use case added should have an index that is one greater than the previous. If it has been determined that a use case cannot run in the automated tests, -then the index number should be replaced with "#X" so that is it included +then the index number should be replaced with "#X" so that it is included in the list for reference but not run by the tests. name @@ -610,7 +644,7 @@ config_args """"""""""" This is the path of the config file used for the use case relative to -**parm/use_cases**. +*parm/use_cases*. Example:: @@ -651,7 +685,7 @@ images using Conda that can be used to run use cases. These images are stored on DockerHub in *dtcenter/metplus-envs* and are named with a tag that corresponds to the keyword without the **_env** suffix. The environments were created using Docker commands via scripts that are found -in **scripts/docker/docker_env**. +in *scripts/docker/docker_env*. Existing keywords that set up Conda environments used for use cases are: * cfgrib_env @@ -670,7 +704,7 @@ Example:: spacetime_env The above example uses the Conda environment -in dtcenter/metplus-envs:**spacetime** to run a user script. +in *dtcenter/metplus-envs*:**spacetime** to run a user script. Note that only one dependency that contains the **_env** suffix can be supplied to a given use case. @@ -680,10 +714,11 @@ Other Environments A few of the environments do not contain Conda environments and are handled a little differently. -* **gempak_env** - Used if GempakToCF.jar is needed for a use case to convert +* **gempak_env** - Used if **GempakToCF.jar** is needed for a use + case to convert GEMPAK data to NetCDF format so it can be read by the MET tools. Instead of creating a Python environment to use for the use case, - this Docker image installs Java and obtains the GempakToCF.jar file. + this Docker image installs Java and obtains the **GempakToCF.jar** file. When creating the Docker container to run the use cases, the necessary Java files are copied over into the container that runs the use cases so that the JAR file can be run by METplus wrappers. @@ -701,13 +736,13 @@ to run a use case: * **py_embed** - Used if a different Python environment is required to run a Python Embedding script. If this keyword is included with a Python environment, then the MET_PYTHON_EXE environment variable will be set to - specify the version of Python3 that is included in that environment + specify the version of Python3 that is included in that environment. Example:: pygrib_env,py_embed -In this example, the dtcenter/metplus-envs:**pygrib** environment is used to +In this example, the *dtcenter/metplus-envs*:**pygrib** environment is used to run the use case. Since **py_embed** is also included, then the following will be added to the call to run_metplus.py so that the Python embedding script will use the **pygrib** environment to run:: @@ -736,14 +771,15 @@ for more information on how to use Python Embedding. * **cartopy** - Used if cartopy 0.18.0 is needed in the Conda environment. Cartopy uses shapefiles that are downloaded as needed. The URL that is used - to download the files has changed since cartopy 0.18.0 and we have run into - issues where the files cannot be obtained. To remedy this issue, we modified - the scripts that generate the Docker images that contain the Conda - environments that use cartopy to download these shape files so they will - always be available. These files need to be copied from the Docker + to download the files has changed since cartopy 0.18.0 and there have been + issues where the files cannot be obtained. + To remedy this issue, the METplus Docker images, which contain the + Conda environments, including Cartopy, have been modified to download + the necessary shape files so that they will always be available. These + files need to be copied from the Docker environment image into the testing image. When this keyword is found in the - dependency list, a different Dockerfile (Dockerfile.run_cartopy found in - .github/actions/run_tests) is used to create the testing environment and + dependency list, a different Dockerfile (**Dockerfile.run_cartopy** found in + *.github/actions/run_tests*) is used to create the testing environment and copy the required shapefiles into place. @@ -757,14 +793,14 @@ packages take a very long time to install in Docker. The new approach involves creating Docker images that use Conda to create a Python environment that can run the use case. To see what is available in each of the existing Python environments, refer to the comments in the scripts found in -**scripts/docker/docker_env/scripts**. +*scripts/docker/docker_env/scripts*. New environments must be added by a METplus developer, so please create a discussion on the `METplus GitHub Discussions `_ forum if none of these environments contain the package requirements needed to run a new use case. -A **README.md** file can be found in **scripts/docker/docker_env** that +A **README.md** file can be found in *scripts/docker/docker_env* that provides commands that can be run to recreate a Docker image if the conda environment needs to be updated. Please note that Docker must be installed on the workstation used to create new Docker images and @@ -807,7 +843,7 @@ Example:: The cartopy python package automatically attempts to download shapefiles as needed. The URL that is used in cartopy version 0.18.0 and earlier no longer -exists, so use cases that needs these files will fail if they are +exists, so use cases that need these files will fail if they are not found locally. If a conda environment uses cartopy, these shapefiles may need to be downloaded by the user running the use case even if the conda environment was created by another user. @@ -826,10 +862,10 @@ Use Case Groups The use cases that are run in the automated test suite are divided into groups that can be run concurrently. -The **use_case_groups.json** file (found in **.github/parm**) +The **use_case_groups.json** file (found in *.github/parm*) contains a list of the use case groups to run together. In METplus version 4.0.0 and earlier, this list was -found in the .github/workflows/testing.yml file. +found in the *.github/workflows/testing.yml* file. Each use case group is defined with the following format:: @@ -904,7 +940,7 @@ It also supports a range of numbers separated with a dash. Example:: The above example will run a job with data_assimilation 0, 1, 2, and 3, then another job with data_assimilation 4 and 5. -You can also use a combination of commas and dashes to define the list of cases +Use a combination of commas and dashes to define the list of cases to run. Example:: { @@ -993,7 +1029,7 @@ After all of the use cases in a group have finished running, the output that was generated is compared to the truth data to determine if any of the output was changed. The truth data for each use case group is stored in a Docker data volume on DockerHub. The **diff_util.py** script -(found in **metplus/util**) is run to compare all of the output files in +(found in *metplus/util*) is run to compare all of the output files in different ways depending on the file type. The logic in this script could be improved to provide more robust testing. diff --git a/docs/Contributors_Guide/documentation.rst b/docs/Contributors_Guide/documentation.rst index 98269f3f33..2585a31bdd 100644 --- a/docs/Contributors_Guide/documentation.rst +++ b/docs/Contributors_Guide/documentation.rst @@ -30,8 +30,8 @@ documentation: * sphinx_rtd_theme-0.4.3 Which versions are being used by the current METplus release can be viewed -by looking at either environment.yml or requirements.txt, both of which -are found in the METplus/ directory. If the desire is to replicate all the +by looking at either **environment.yml** or **requirements.txt**, both of which +are found in the *METplus/* directory. If the desire is to replicate all the packages employed by METplus, please refer to :numref:`conda_env` of the Contributor's Guide. @@ -53,7 +53,7 @@ Documentation for the use cases is found in the following directories: * *METplus/docs/use_cases/model_applications* * This directory contains documentation pertaining to use cases that are - based on model data, and utilize more than one MET tool/METplus + based on model data, and utilize more than one MET *tool/METplus* wrapper. Please refer to the :ref:`Document New Use Case ` @@ -87,11 +87,11 @@ User's Guide: * Modify any of the affected sections from the *METplus/docs/Users_Guide* directory: - * glossary.rst (Glossary) - * references.rst (Reference) - * systemconfiguration.rst (System Configuration) - * usecases.rst (Use cases) - * wrappers.rst (METplus wrappers) + * **glossary.rst** (Glossary) + * **references.rst** (Reference) + * **systemconfiguration.rst** (System Configuration) + * **usecases.rst** (Use cases) + * **wrappers.rst** (METplus wrappers) Contributor's Guide: ~~~~~~~~~~~~~~~~~~~~ @@ -100,21 +100,21 @@ Contributor's Guide: * Modify any of the affected sections from the *METplus/docs/Contributors_Guide* directory: - * add_use_case.rst (How to add new use cases) - * basic_components.rst (The basic components of a METplus wrapper) - * coding_standards.rst (The coding standards currently in use) - * conda_env.rst (How to set up the conda environment for + * **add_use_case.rst** (How to add new use cases) + * **basic_components.rst** (The basic components of a METplus wrapper) + * **coding_standards.rst** (The coding standards currently in use) + * **conda_env.rst** (How to set up the conda environment for running METplus) - * continuous_integration.rst (How to set up a continuous integration - workflow) - * create_wrapper.rst (How to create a new METplus wrapper) - * deprecation.rst (What to do to deprecate a variable) - * documentation.rst (Describing the documentation process and files) - * github_workflow.rst (A description of how releases are made, + * **continuous_integration.rst** (How to set up a continuous integration + workflow) + * **create_wrapper.rst** (How to create a new METplus wrapper) + * **deprecation.rst** (What to do to deprecate a variable) + * **documentation.rst** (Describing the documentation process and files) + * **github_workflow.rst** (A description of how releases are made, how to to obtain source code from the GitHub repository) - * index.rst (The page that shows all the 'chapters/sections' + * **index.rst** (The page that shows all the 'chapters/sections' of the Contributor's Guide) - * testing.rst (A description of how to set up testing the + * **testing.rst** (A description of how to set up testing the wrapper code) Release Guide: @@ -124,40 +124,40 @@ Release Guide: any METplus component, including official, bugfix, and development releases. -* Each METplus component has a top level file (e.g. metplus.rst) +* Each METplus component has a top level file (e.g. **metplus.rst**) which simply contains references to files for each of the - releases. For example, metplus.rst contains references to: + releases. For example, **metplus.rst** contains references to: - * metplus_official - * metplus_bugfix - * metplus_development + * metplus_official. + * metplus_bugfix. + * metplus_development. -* Each release file (e.g. metplus_official.rst, metplus_bugfix.rst, - metplus_development.rst) contains, at a minimum, a replacement +* Each release file (e.g. **metplus_official.rst**, **metplus_bugfix.rst**, + **metplus_development.rst**) contains, at a minimum, a replacement value for the projectRepo variable and include statements for each release step. These individual steps - (e.g. open_release_issue.rst, clone_project_repository.rst, etc.) + (e.g. **open_release_issue.rst**, **clone_project_repository.rst**, etc.) may be common to multiple METplus components. These common steps are located in the *release_steps* directory. However, a METplus - component may have different instructions from other componenets - (e.g. For METplus wrappers, update_version.rst, - create_release_extra.rst, etc.). In this case, the instructions + component may have different instructions from other components + (e.g. For **METplus wrappers**, **update_version.rst**, + **create_release_extra.rst**, etc.). In this case, the instructions that are specific to that component are located in a subdirectory of *release_steps*. For example, files that are specific to METplus wrappers are located in *release_steps/metplus*, files that are specific to METcalcpy are located in *release_steps/metcalcpy*. -* The file for each individual step (e.g. open_release_issue.rst, - update_version.rst, etc.) contains the instructions for +* The file for each individual step (e.g. **open_release_issue.rst**, + **update_version.rst**, etc.) contains the instructions for completing that step for the release. Verification Datasets Guide: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* To add/modify any relevant datasets in attempt to create a - centralized catalogue of verification datasets to provide the model +* To add/modify any relevant datasets in an attempt to create a + centralized catalog of verification datasets to provide the model verification community with relevant "truth" datasets. See the `Verification Datasets Guide Overview `_ for more information. @@ -172,11 +172,11 @@ build and display the documentation. Read the Docs simplifies the documentation process by building, versioning, and hosting the documentation. Read the Docs supports multiple versions for each repository. For the METplus -compoents, the "latest" version will point to the latest official (stable) +components, the "latest" version will point to the latest official (stable) release. The "develop" or "development" version will point to the most up to date development code. There may also be other previous versions of the software available in the version selector menu, which is accessible by -clicking in the bottom left corner of the the documentation pages. +clicking in the bottom left corner of the documentation pages. Automation rules allow project maintainers to automate actions on new branches and tags on repositories. For the METplus components, documentation is @@ -191,14 +191,16 @@ The documentation of these "versions" are automatically hidden, however, the documentation can be accessed by directly modifying the URL. For example, to view "feature_836_rtd_doc" for the METplus repository the URL would be: - **https://metplus.readthedocs.io/en/feature_836_rtd_doc** + *https://metplus.readthedocs.io/en/feature_836_rtd_doc* (Note that this link is not valid as this branch does not currently exist, - however contributors can replace the "feature_836_rtd_doc" with the + however contributors can replace the "*feature_836_rtd_doc*" with the appropriate branch name.) -The URL branch name will be lowercase regardless of the actual branch letter casing, -i.e. "feature_836_RTD_Doc" branch would be accessed by the above mentioned URL. +The URL branch name will be lowercase regardless of the actual branch +letter casing, +i.e. "*feature_836_RTD_Doc*" branch would be accessed by the +above-mentioned URL. Read the Docs will automatically delete the documentation for a feature branch and a bugfix branch when the branch is deleted. @@ -242,7 +244,7 @@ This script does the following: * Builds the Sphinx documentation * Builds the doxygen documentation * Removes unwanted text from use case documentation -* Copies doxygen files into _build/html for easy deployment +* Copies doxygen files into* _build/html* for easy deployment * Creates symbolic links under Users_Guide to the directories under 'generated' to preserve old URL paths diff --git a/docs/Contributors_Guide/github_workflow.rst b/docs/Contributors_Guide/github_workflow.rst index dd748a672a..3d9134076b 100644 --- a/docs/Contributors_Guide/github_workflow.rst +++ b/docs/Contributors_Guide/github_workflow.rst @@ -293,7 +293,10 @@ Push the feature branch to GitHub to push the changes to the origin (i.e. to the *https://github.com//METplus* repository). + +.. _pull-request-browser: + Open a pull request using a browser ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/Contributors_Guide/testing.rst b/docs/Contributors_Guide/testing.rst index 3db6f6ff72..93c2f9627f 100644 --- a/docs/Contributors_Guide/testing.rst +++ b/docs/Contributors_Guide/testing.rst @@ -4,19 +4,59 @@ Testing Test scripts are found in the GitHub repository in the internal_tests directory. +.. _cg-unit-tests: + Unit Tests ---------- Unit tests are run with pytest. They are found in the *pytests* directory. Each tool has its own subdirectory containing its test files. -**run_pytests.sh** is a bash script that can be run to execute all of the -pytests. A report will be output showing which pytest categories failed. -When running on a new computer, a -**minimum_pytest..sh** +Unit tests can be run by running the 'pytest' command from the +internal_tests/pytests directory of the repository. +The 'pytest' Python package must be available. +A report will be output showing which pytest categories failed. +When running on a new computer, a **minimum_pytest..sh** file must be created to be able to run the script. This file contains information about the local environment so that the tests can run. +All unit tests must include one of the custom markers listed in the +internal_tests/pytests/pytest.ini file. Some examples include: + + * util + * wrapper_a + * wrapper_b + * wrapper_c + * wrapper + * long + * plotting + +To apply a marker to a unit test function, add the following on the line before +the function definition:: + + @pytest.mark. + +where is one of the custom marker strings listed in pytest.ini. + +New pytest markers should be added to the pytest.ini file with a brief +description. If they are not added to the markers list, then a warning will +be output when running the tests. + +There are many unit tests for METplus and false failures can occur if all of +the are attempted to run at once. +To run only tests with a given marker, run:: + + pytest -m + +To run all tests that do not have a given marker, run:: + + pytest -m "not " + +Multiple marker groups can be run by using the 'or' keyword:: + + pytest -m " or " + + Use Case Tests -------------- diff --git a/docs/Users_Guide/glossary.rst b/docs/Users_Guide/glossary.rst index 5bd8a35593..cdfead0a9e 100644 --- a/docs/Users_Guide/glossary.rst +++ b/docs/Users_Guide/glossary.rst @@ -9605,3 +9605,46 @@ METplus Configuration Glossary Guide for more information on multi-variate MODE. | *Used by:* MODE + + CYCLONE_PLOTTER_GLOBAL_PLOT + Set to True to plot entire global extent in CyclonePlotter or set to False + to generate a plot of a defined region of the world, then define lons and + lats with :term:`CYCLONE_PLOTTER_WEST_LON`, + :term:`CYCLONE_PLOTTER_EAST_LON`, :term:`CYCLONE_PLOTTER_SOUTH_LAT`, and + :term:`CYCLONE_PLOTTER_NORTH_LAT`. + + | *Used by:* CyclonePlotter + + CYCLONE_PLOTTER_WEST_LON + Set the west longitude boundary for CyclonePlotter. + Only used if :term:`CYCLONE_PLOTTER_GLOBAL_PLOT` is False. + + | *Used by:* CyclonePlotter + + CYCLONE_PLOTTER_EAST_LON + Set the east longitude boundary for CyclonePlotter. + Only used if :term:`CYCLONE_PLOTTER_GLOBAL_PLOT` is False. + + | *Used by:* CyclonePlotter + + CYCLONE_PLOTTER_SOUTH_LAT + Set the south latitude boundary for CyclonePlotter. + Only used if :term:`CYCLONE_PLOTTER_GLOBAL_PLOT` is False. + + | *Used by:* CyclonePlotter + + CYCLONE_PLOTTER_NORTH_LAT + Set the north latitude boundary for CyclonePlotter. + Only used if :term:`CYCLONE_PLOTTER_GLOBAL_PLOT` is False. + + | *Used by:* CyclonePlotter + + CYCLONE_PLOTTER_ANNOTATION_FONT_SIZE + Set the annotation font size for CyclonePlotter output. + + | *Used by:* CyclonePlotter + + CYCLONE_PLOTTER_RESOLUTION_DPI + Set the resolution for CyclonePlotter output. + + | *Used by:* CyclonePlotter diff --git a/docs/Users_Guide/quicksearch.rst b/docs/Users_Guide/quicksearch.rst index 4249e3b38c..1c4070a668 100644 --- a/docs/Users_Guide/quicksearch.rst +++ b/docs/Users_Guide/quicksearch.rst @@ -70,7 +70,7 @@ Use Cases by Application: | `Air Quality and Composition <../search.html?q=AirQualityAndCompAppUseCase&check_keywords=yes&area=default>`_ | `Climate <../search.html?q=ClimateAppUseCase&check_keywords=yes&area=default>`_ - | `Convection Allowing Models <../search.html?q=ConvectionAllowingModelsAppUseCase&check_keywords=yes&area=default>`_ + | `Short Range <../search.html?q=ShortRangeAppUseCase&check_keywords=yes&area=default>`_ | `Data Assimilation <../search.html?q=DataAssimilationAppUseCase&check_keywords=yes&area=default>`_ | `Ensemble <../search.html?q=EnsembleAppUseCase&check_keywords=yes&area=default>`_ | `Marine and Cryosphere <../search.html?q=MarineAndCryosphereAppUseCase&check_keywords=yes&area=default>`_ @@ -78,13 +78,15 @@ Use Cases by Application: | `Precipitation <../search.html?q=PrecipitationAppUseCase&check_keywords=yes&area=default>`_ | `Space Weather <../search.html?q=SpaceWeatherAppUseCase&check_keywords=yes&area=default>`_ | `Subseasonal to Seasonal <../search.html?q=S2SAppUseCase&check_keywords=yes&area=default>`_ + | `Subseasonal to Seasonal: Madden-Julian Oscillation <../search.html?q=S2SMJOAppUseCase&check_keywords=yes&area=default>`_ + | `Subseasonal to Seasonal: Mid-Latitude <../search.html?q=S2SMidLatAppUseCase&check_keywords=yes&area=default>`_ | `Tropical Cyclone and Extra-Tropical Cyclone <../search.html?q=TCandExtraTCAppUseCase&check_keywords=yes&area=default>`_ .. only:: latex | **Air Quality and Composition**: *AirQualityAndCompAppUseCase* | **Climate**: *ClimateAppUseCase* - | **Convection Allowing Models**: *ConvectionAllowingModelsAppUseCase* + | **Short Range**: *ShortRangeAppUseCase* | **Data Assimilation**: *DataAssimilationAppUseCase* | **Ensemble**: *EnsembleAppUseCase* | **Marine and Cryosphere**: *MarineAndCryosphereAppUseCase* @@ -92,6 +94,8 @@ Use Cases by Application: | **Precipitation**: *PrecipitationAppUseCase* | **Space Weather**: *SpaceWeatherAppUseCase* | **Subseasonal to Seasonal**: *S2SAppUseCase* + | **Subseasonal to Seasonal: Madden-Julian Oscillation**: *S2SMJOAppUseCase* + | **Subseasonal to Seasonal: Mid-Latitude**: *S2SMidLatAppUseCase* | **Tropical Cyclone and Extra-Tropical Cyclone**: *TCandExtraTCAppUseCase* Use Cases by Organization: diff --git a/docs/Users_Guide/wrappers.rst b/docs/Users_Guide/wrappers.rst index 86fc2052c8..faacd539eb 100644 --- a/docs/Users_Guide/wrappers.rst +++ b/docs/Users_Guide/wrappers.rst @@ -148,6 +148,13 @@ METplus Configuration | :term:`CYCLONE_PLOTTER_CROSS_MARKER_SIZE` | :term:`CYCLONE_PLOTTER_GENERATE_TRACK_ASCII` | :term:`CYCLONE_PLOTTER_ADD_WATERMARK` +| :term:`CYCLONE_PLOTTER_GLOBAL_PLOT` +| :term:`CYCLONE_PLOTTER_WEST_LON` +| :term:`CYCLONE_PLOTTER_EAST_LON` +| :term:`CYCLONE_PLOTTER_NORTH_LAT` +| :term:`CYCLONE_PLOTTER_SOUTH_LAT` +| :term:`CYCLONE_PLOTTER_ANNOTATION_FONT_SIZE` +| :term:`CYCLONE_PLOTTER_RESOLUTION_DPI` | .. warning:: **DEPRECATED:** diff --git a/docs/Verification_Datasets/datasets/aeronet.rst b/docs/Verification_Datasets/datasets/aeronet.rst index 80fcaa4e9f..08e9f10cec 100644 --- a/docs/Verification_Datasets/datasets/aeronet.rst +++ b/docs/Verification_Datasets/datasets/aeronet.rst @@ -52,4 +52,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataAERONET - .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataLevelUpperAir, DataProviderNASA, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataLevelUpperAir, DataProviderNASA, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/gdas_prepbufr.rst b/docs/Verification_Datasets/datasets/gdas_prepbufr.rst index 231d08fb7e..4c2848de99 100644 --- a/docs/Verification_Datasets/datasets/gdas_prepbufr.rst +++ b/docs/Verification_Datasets/datasets/gdas_prepbufr.rst @@ -48,4 +48,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataGDASPREP - .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataLevelUpperAir, DataProviderNOAA, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataLevelUpperAir, DataProviderNOAA, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/goes_level_1b.rst b/docs/Verification_Datasets/datasets/goes_level_1b.rst index e396908481..fda714672e 100644 --- a/docs/Verification_Datasets/datasets/goes_level_1b.rst +++ b/docs/Verification_Datasets/datasets/goes_level_1b.rst @@ -57,4 +57,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataGOESLEV1B - .. note:: **Data Labels:** DataTypeGridded, DataLevelSatellite, DataProviderNASA, DataApplicationConvectionAllowingModels + .. note:: **Data Labels:** DataTypeGridded, DataLevelSatellite, DataProviderNASA, DataApplicationShortRange diff --git a/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst b/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst index 08d23128d1..c461f77d05 100644 --- a/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst +++ b/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst @@ -63,4 +63,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataGOESLEV2AERO - .. note:: **Data Labels:** DataTypeGridded, DataLevelSatellite, DataProviderNASA, DataApplicationConvectionAllowingModels + .. note:: **Data Labels:** DataTypeGridded, DataLevelSatellite, DataProviderNASA, DataApplicationShortRange diff --git a/docs/Verification_Datasets/datasets/madis.rst b/docs/Verification_Datasets/datasets/madis.rst index 5d8d07556e..dcd42a0cdf 100644 --- a/docs/Verification_Datasets/datasets/madis.rst +++ b/docs/Verification_Datasets/datasets/madis.rst @@ -47,4 +47,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataMADIS - .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataProviderNOAA, DataApplicationPrecipitation, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataProviderNOAA, DataApplicationPrecipitation, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/metar_isu.rst b/docs/Verification_Datasets/datasets/metar_isu.rst index e3ffef5ed8..1c2703ac11 100644 --- a/docs/Verification_Datasets/datasets/metar_isu.rst +++ b/docs/Verification_Datasets/datasets/metar_isu.rst @@ -46,4 +46,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataMETAR - .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataProviderISU, DataApplicationPrecipitation, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataProviderISU, DataApplicationPrecipitation, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/mping.rst b/docs/Verification_Datasets/datasets/mping.rst index ed92a5479d..6d3b2e24cd 100644 --- a/docs/Verification_Datasets/datasets/mping.rst +++ b/docs/Verification_Datasets/datasets/mping.rst @@ -48,4 +48,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataMPING - .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataProviderOU, DataApplicationPrecipitation, DataApplicationConvectionAllowingModels + .. note:: **Data Labels:** DataTypePoint, DataLevelSurface, DataProviderOU, DataApplicationPrecipitation, DataApplicationShortRange diff --git a/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst b/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst index c74faa8fe7..49b852b5d2 100644 --- a/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst +++ b/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst @@ -41,4 +41,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataMRMSCompositeReflectivity - .. note:: **Data Labels:** DataTypeGridded, DataLevelSurface, DataProviderNOAA, DataApplicationConvectionAllowingModels + .. note:: **Data Labels:** DataTypeGridded, DataLevelSurface, DataProviderNOAA, DataApplicationShortRange diff --git a/docs/Verification_Datasets/datasets/nexrad_level_2.rst b/docs/Verification_Datasets/datasets/nexrad_level_2.rst index c07e4a8718..e02e14ae37 100644 --- a/docs/Verification_Datasets/datasets/nexrad_level_2.rst +++ b/docs/Verification_Datasets/datasets/nexrad_level_2.rst @@ -49,4 +49,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataNexradLevel2 - .. note:: **Data Labels:** DataTypeGridded, DataLevelSurface, DataProviderNOAA, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Labels:** DataTypeGridded, DataLevelSurface, DataProviderNOAA, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/nexrad_level_3.rst b/docs/Verification_Datasets/datasets/nexrad_level_3.rst index fb4051edc3..5212783e63 100644 --- a/docs/Verification_Datasets/datasets/nexrad_level_3.rst +++ b/docs/Verification_Datasets/datasets/nexrad_level_3.rst @@ -52,4 +52,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataNexradLevel3 - .. note:: **Data Type Labels:** DataTypeGridded, DataLevelSurface, DataProviderNOAA, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Type Labels:** DataTypeGridded, DataLevelSurface, DataProviderNOAA, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/opera_eumetnet.rst b/docs/Verification_Datasets/datasets/opera_eumetnet.rst index 631ae695f2..7353e9912d 100644 --- a/docs/Verification_Datasets/datasets/opera_eumetnet.rst +++ b/docs/Verification_Datasets/datasets/opera_eumetnet.rst @@ -51,4 +51,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataOperaEumetnet - .. note:: **Data Labels:** DataTypeGridded, DataLevelSurface, DataProviderEUMETNET, DataApplicationPrecipitation, DataApplicationConvectionAllowingModels + .. note:: **Data Labels:** DataTypeGridded, DataLevelSurface, DataProviderEUMETNET, DataApplicationPrecipitation, DataApplicationShortRange diff --git a/docs/Verification_Datasets/datasets/template.rst b/docs/Verification_Datasets/datasets/template.rst index 66db980211..2c6a13021b 100644 --- a/docs/Verification_Datasets/datasets/template.rst +++ b/docs/Verification_Datasets/datasets/template.rst @@ -80,7 +80,7 @@ Keywords DataProviderUSAF Select at least one DataApplication label: DataApplicationClimate - DataApplicationConvectionAllowingModels + DataApplicationShortRange DataApplicationEnsemble DataApplicationMarineAndCryo DataApplicationMediumRange diff --git a/docs/Verification_Datasets/datasets/viirs.rst b/docs/Verification_Datasets/datasets/viirs.rst index 0ba0fc2ff6..20f61c1567 100644 --- a/docs/Verification_Datasets/datasets/viirs.rst +++ b/docs/Verification_Datasets/datasets/viirs.rst @@ -52,4 +52,4 @@ METplus Use Cases Keywords .. note:: **Current Dataset:** VxDataVIIRS - .. note:: **Data Labels:** DataTypeGridded, DataLevelSatellite, DataProviderNASA, DataApplicationConvectionAllowingModels, DataApplicationMediumRange + .. note:: **Data Labels:** DataTypeGridded, DataLevelSatellite, DataProviderNASA, DataApplicationShortRange, DataApplicationMediumRange diff --git a/docs/Verification_Datasets/quicksearch.rst b/docs/Verification_Datasets/quicksearch.rst index 722c4aa068..b199566291 100644 --- a/docs/Verification_Datasets/quicksearch.rst +++ b/docs/Verification_Datasets/quicksearch.rst @@ -5,33 +5,33 @@ Quick Search for Datasets Dataset Types ------------- -| `Point Data `_ -| `Gridded Data `_ +| `Point Data <../search.html?q=DataTypePoint&check_keywords=yes&area=default>`_ +| `Gridded Data <../search.html?q=DataTypeGridded&check_keywords=yes&area=default>`_ Dataset Levels -------------- -| `Surface Data `_ -| `Upper-Air Data `_ -| `Satellite Data `_ +| `Surface Data <../search.html?q=DataLevelSurface&check_keywords=yes&area=default>`_ +| `Upper-Air Data <../search.html?q=DataLevelUpperAir&check_keywords=yes&area=default>`_ +| `Satellite Data <../search.html?q=DataLevelSatellite&check_keywords=yes&area=default>`_ Dataset Providers ----------------- -| `EUMETNET `_ -| `ISU `_ -| `NOAA `_ -| `NASA `_ -| `OU `_ -| `USAF `_ -| `NSIDC `_ +| `EUMETNET <../search.html?q=DataProviderEUMETNET&check_keywords=yes&area=default>`_ +| `ISU <../search.html?q=DataProviderISU&check_keywords=yes&area=default>`_ +| `NOAA <../search.html?q=DataProviderNOAA&check_keywords=yes&area=default>`_ +| `NASA <../search.html?q=DataProviderNASA&check_keywords=yes&area=default>`_ +| `OU <../search.html?q=DataProviderOU&check_keywords=yes&area=default>`_ +| `USAF <../search.html?q=DataProviderUSAF&check_keywords=yes&area=default>`_ +| `NSIDC <../search.html?q=DataProviderNSIDC&check_keywords=yes&area=default>`_ Dataset Applications -------------------- -| `Climate `_ -| `Convection Allowing Models `_ -| `Ensemble `_ -| `Marine and Cryosphere `_ -| `Medium Range `_ -| `Precipitation `_ -| `Space Weather `_ -| `Subseasonal to Seasonal `_ -| `Tropical Cyclone and Extra-Tropical Cyclone `_ +| `Climate <../search.html?q=DataApplicationClimate&check_keywords=yes&area=default>`_ +| `Ensemble <../search.html?q=DataApplicationEnsemble&check_keywords=yes&area=default>`_ +| `Marine and Cryosphere <../search.html?q=DataApplicationMarineAndCryo&check_keywords=yes&area=default>`_ +| `Medium Range <../search.html?q=DataApplicationMediumRange&check_keywords=yes&area=default>`_ +| `Precipitation <../search.html?q=DataApplicationPrecipitation&check_keywords=yes&area=default>`_ +| `Short Range <../search.html?q=DataApplicationShortRange&check_keywords=yes&area=default>`_ +| `Space Weather <../search.html?q=DataApplicationSpaceWeather&check_keywords=yes&area=default>`_ +| `Subseasonal to Seasonal <../search.html?q=DataApplicationS2S&check_keywords=yes&area=default>`_ +| `Tropical Cyclone and Extra-Tropical Cyclone <../search.html?q=DataApplicationTCandExtraTC&check_keywords=yes&area=default>`_ diff --git a/docs/_static/s2s-GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.png b/docs/_static/s2s-GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9775a2aeb4a3073dfcc96f1b8ca2e0dbe38809 GIT binary patch literal 727740 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 BGO*_=|%&NW=l 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®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%0A1Mn=d+<`<<)KVOAw?yOVtzLZ$ z1^j>^&zE6J#r&;MzgPQy6rjjowd9gV<&7cP-Gw|--fEr-Nz6y3mX$P!Dh6 zLxz!MXZTnLgM2%G&oC{@2A8+yQ08MiVU{oZ&AR%{`@0o35uPt`Uf`>z&&L}tAB!G} zYR4jK6`|)M*C~{J%M^Y)3g|)SKh#;_xA#uqI)H_d)=bj9?5;1tMO_Q&cn!T|u82a& z=hRjnq=SPfo_BY&V{yQ|4dt^s9tmX`fp-UIdi7$-RoOKhHLSS0TL)vhZ86TQwMEx7 z3bJ`znYBCKw=$IuS8p?m1x6+%jb+SAjfh8P(3E5^J>;q3+f@t*m?}owl9^ zt(AONCQik8=9A*1>_f@vY_Dijihk7}d#q?bo3_l;xal2l)Bl3jr$i{z60PMA*%uaH zMAkwq!JB(Z3jwdehrF&1e5E3`Ieif?y>dgKxf>|1Hr8+%h9#HEThA>k;nL7^%QmXG zyW?{6h3P!AX@iXjn^^E}SU37c4gWd@9hcU}yL8F5nY7Ds?z~63BTZ5`lm%J}w`|v2h1@;Y zi)VKT?_6K&W0}1u{p@RlHjTUeA+@W$kB z8JDUmx1491wu>?1rlfO=oa@55ueWn{Yj1aJ>|`5MZIL-Oc{HQoZ$^=oQy3THQz3TxXdjBKZO-w7iv6^-XukXQedv*@(w za^s3~E7#X!V`G=$mhm_>sPX4rhk*U&Sg?QW7u^#&KXVQy{gsYMQ>450SJD3}unS(| zJj?H1x&Mvhc#?MeP8>14^Oj62^L)@UPhfeg+{N)C{zzk#;W#!`qWT6XP$Bt_hX{2MwwS!|wdY5@@Pg9@o_Gj}kPl>FA*mF8m_9@&_aOO7&v2bwrnC~Rq zG7i7V7@VL9FL&W72$M*=Q^8=IJSi7`z8Ajkq>#AF0K8nh=G_gJVO@MDqsnl%OqrIK z6Gh|uY#A9|KAW$XaCd^3e|z_PhIdZ09VY(HF!U~L4jnp_cFws7^SAj}ulg(Jo6}w^ z-^RNJ1a2h+#6>4f|MtTl#`iflu(`S%qX;Iy_JvQ!#~*qydWQFauN~2gsI;9!(3>XD z#~cS@FHFxfzLsziwZ{1;j4N?D2~vvM)r--5Rs`^V1xQp~xI%kL*b^Tx4PW>`TwbPoH@T!CQ?T z>R4bP{JZ`3+taR5>8XMm>2s#ZwmZ{$pEDixF0H=a@1hnToWIu7Hs!FLN96bQciZPB z&&u-!^YEQ~&M_|kb?2>@f-HrAmL&|0r@-rxM;=KEB^6FC)`Yh_Qg>1L3<&d;M=L1# z$AA3CR1M28ANjd?S_k{+PyXaj(q~$h;zFwu(=msFYi0a&a(lO_@|m!L6~&p;r(*wYd*iOLLU_GO zT`fPu%XrQiRM-g{;bgE}+hkkh{XXY(d2wkyjVE6hUU`A*{6e@{#;p$KnZ_)1Y8B!4 z>vN0o9Or61%K1AF^tH#GxW~G`+#Nq)=0WnoEyY1KKM>6 z$`py4WvJXLp#&@A+OHXq1|HZ6^Gad;I4AboxC=jDqJS3Ofn`@t0HN=b{~x&FnMt#m2uk1Gv}~C#V2zBa4);ykl*>lg|z&RRS7 zVr;^nNTXieqK z;-Wkt)Ak#UsXRV2{dDZQe(;Q^uYK)n$$gu`Vb>tiBL!DliMm#E92?hmCj3er^fmx= zgQ&Ug(u-Vw`$24Qx=~#dUXBgci_k2UlQ~qY8=RBHSt1ATjz{+16AVY_`C?M+96fq0 zSvF~Dq5DJK6&}>80^X=H&9)eOly4g@V7vPVaRZBD1{(bm8ykam zaJFpWAuPNX^(xkp_FJa8t|i@RFK>}H%bWi6PyaMVM?K@OBfYoXfB*M?pRVtJ|NCjp z=XzW|;<{2r*zf$#@5JXm_qnu*LVWNtNTYwH04!7g(FXSXB-n0haRrb)U(bJnJ#Cm$ zv5hBynhGwij9)X!#y+rGZ;4N7p;<;Dg;J{n{Fk*YEr+{?pTk z$@2;yv<;3s@k)iW@DdinTFV>9ro7$t_2Z8}o;I8)oHaQAm;e6W@BLmnlS{bCb5(c= zAIF3JVKD!UN9jf5&$|i%=N!r}l&9!f!?EF*(Hd22F6UR$wU2-N<4F-|f93uW$5rY& z=A3&e99Jo&Ttqsj(%1CPTf`aZgm@!u6bC$O)p6uF6IYxQIcGFqamM+dau{*K{0!Eu z5gHKqpg|yy3Gvg*aq*=ueJRnxdRd?})bW-#04hIp%(>1S8yib>)cAgvZ>f}W?3lmf z!0~EuZgDfTGRJZJNT(f(xvq|7%TeK_vf0gk@Npzi* z)NAgICxP|K1kroG@;Bp|mlIUWb+TeU?ig?~V;%CloYuHrrpxs(A44w7XTSN|_DYD| zMdu{w=Rg1X<#Rfm4CP%yE^18UWLsEBz-^Zc7vE=vpp!N0B_ol+I59Jhbv8KJ8ikm< zE8IL4Oj&+ba9JOB9eJtvvc2ZD{W6|;dbhpiWx3Wlx7+sloPS$qLxw~BxAdXzPmYrr zl>$QRnHPB(4}`yq2pN;l*2OyHkn{1r{W<^6aU1sr1a1lf;Iw!KLM0)$^yFj`*!RcE_jh+8_7dH5#qE$58qpQMq(7HkZd^ksYEdSPiUlP`2j{c%ZhsQIVmr z*#CfqtqLiq^|HO23XwRsrc_yq9>)7{S8MDYWG6YwD-UD`G?#y!D|Ywd zlB-n3g%G>xITxeGIZ-tg=m;CK5Q!qL%Hwio@8LszKNQbb-q<|Ep;&oQPo5RR)HV5< zwaniYxh91mcikn%>8Jwqw2KvbJ_GM?q0#{_k#5U>Ge67xRaa-p zRTKTH@J_l~Pv3nujs2YIYf|{xiQ>vuU9WpH-i<K7+h)lMeML4)u>Qix-M#X)IX8CzH{0Vp!e@D<@RK*1mpcxHLFPIBRv@TS z%lw>s$hYLJ3ccjTrt`Z3Gx@iKAilW(06+jqL_t(#nV-DPIfePD95artkUsO7&s!u^nZE%Hq5A z6~D9!N=U(PzpLy~(AbJl*L2Q*oS)c!F9obgV9wma_$}a}`P?v&_vJtvuN8!$L3d;o z>bRq&E%t37G=>&mK&dp0vO~pkJ7u<`h~9~{>KJDunk=8)r^1He#$R5VoyBt5)@1!u zW@AqW^CA@cm0qmBppVU1do}aEnLg8Pmbi6ULC&+|v)s)*cep=V1_omt_%GI)V+uvb z%;IV+;F@aR0uDuQe`0$87A{%l$%uFICWSNUzd3V3hj!P#1#tHof3M*(B3t-Llk=Wr8CEZzF8 z&tIf`l#2+!Re-Ec9OJ%%C093AQ72=av$%9;=UHYgyxV{#SEo-W7?yV27p*Ns+ZARVwT@|F9;-{Oqp%e#tdX;)q!s4Tbs(kf|-bsZZUOUgL~|BhArQ>A~VkJ6<2 zU|ER{Y`si4QXk?g#|1ct{RH#!9fp` z?@n#B&eF~b3NEeY+UXnJ7OKo@LYZ5XoU*etaIqQ-&~@A7Z_DexdPer9bNp1ixS2(q(@L^KH^O`NM*l#6G_5Yh{KUmLdgRq)38uxYYb)y~ zZ<4l4^IZptEB31}m3JsybiI~0E!tmxH=g`N-Xu?PO__s&KKX-m*L1qObt6VzFWUbK z0u|EFC{(IDt0v=f>seQaXSw2?PH^{0~pk5>+#~tuX6U*V!~$y zo$^Texp*vJRRF4@%Xi|uu(thHKUcC+dee-?A%1!W}iA{oadR=yZJgt6lWZBd2Hmd zX&#Pc>990Yysg%5?Hs{(&fD|GHOGtZ zj4!S`1{{AG?|ok{d%a%!jc>3nmhYNMzG&HwcgK_EcuA{Oa#<(ix>-ac3h&Z->n1;R zOv@_`=4IZE(11V#0v`+rd?;s65;KF7?BD+F-%blZ7giqF>JA%;s1rsBkdtXI7ioDR zDDljMC=)&J5;F776B#G%Dv;{GIni-ZAW=1#kI(h*{p}=20&1BOLy5FR)Vw6n1}7&H z#~e3LeyoQf*RlTDd@@l!e*Ab^WLQtz@1)7L3YU6?jzl=`GH}9V{O^AEyO(zsna*|> z!l0Hk(Q@~aI~SaATQBQuy{x}=ux-9KZ|j-ikeN+>m+S6t^S68jQkE%`a zc;A4)TS1_V>!K=xidPW={fyn3XK_KZd*_b$+9UVHfAi`4qjw0Gg1ExjR6v4oWqtBo ztWL7ydJap;Ma~9b(XMM2ccXf~Rgz}iU`};|Pj6M#cl=$kj%Qr7=!OfIM+(?#%P6Pj zT>Nuja@$a>3_}Bvn9g(dmR1SdN3_C9-|gydivxWq#G2-#vNR5CE+Jf;jx~e}>l_-c zaA<3|zT^777YXeL;c}&}Z?9(x_lb&03m1huT5x}cV7A_6Vsd##Ibcpw4hlalzSyLG z!{Fy3cCPnzbjAG-ek__k^GGx!)LX;iLxI(q(`OJ`zRHG&6Y0QhX>q3i((PX8xAb%b zz9TJH`K4<^&l8bHcn*s1GHvx;5&}Sv1xVuO(Ah+5t?3mYUAx}W{~N~Hj!jo*V{-X~ ziVy2=y{wP*QpoUq&c^VZm3=H^R6gZ%Op>sIbe`Lmgz#kRSu8Hf6z=J+Nh^zUjOn$t zLZB!-aL&n<@*yu(jE#IRDHKWBR41uK<@ZU+zWu$=N@;uM>A(dj8p%pP5RonI3)g zQR>v0>a>DFNLW8lTYrcZ>i|O9d+xp`x$v@1j%$U%Rp7XeK+zsm3A2n6O#HJQUe3?N z8_$IrLTLIRJFA70LL%FrET6XKEp%PVCs$a!H(vmhUln(MUjx7Lyr2c#?xSBH?;DPL zyNBYbh3WVSR$KeA*6D?APf{y&@t6OpXy~6pTF7A$(395Z#nyl7-{QP|qY`A<7WV}&z%CTpcQJGUI?W|m`o z0UD7eAZb91_YrxcgEarXAx52|S zFQZQENm}77q6MsNJa*Bm@@g?i4>4i#MMeA_gQeX8<|f9s2EvO52Avbt(PA=uit z7YnU@>G%5FMXa{Yrn9!%cHJATgZpFo%=58y;uo=U_Qe!Ow}t6UE-h)G2j(k$J)f(k zXE*c@;Wq9Jn@R{c{hs^USliI;s^;^<`q@@3d}_4GUBut{&UcxMpGfp-VR0dzedgIT zKkrBIuJS>Pt^)^d=e#tOZMLzQGS@u=3~Q8b4q5NQb>;BwYz|>QapsxWm^~SD(DKsXFjhdtE=^km%!a(eMncP{#04(h8$_`3NTq)WiH32 zAM^FM_|pnqX<^P+p$~7nlcEEi>yntrH>n&>nd0&e)9$;hjUQbz2#O zlNV$1`0LSLX^WZ3OYtyPSNq{#uHTLwD=dfQGg=Lej*fDwyw1B%SHA;!x{KQ095Yc^*5Pyg+{_#d#&9liVBc=e6b@fZK| ze~cFozn*xl_$Zo*htC_|7ZJ2!AGs!QQK2E=Q>tNe9ryS7$7;aD)fu=C1mQgJ`0 zy=fRVBED@1BpO31`_FNzaJwEq{qDH&oHXYc#do0m*t+`C^Wm9F zzw@_wI*Bn)e>*ubShm6)Cpj)0B$9a|W4$HB-hE&H>^m>>HLY#S$|83cSjQZMh2=Tv zwmf(7Nz7#~zE|+(#B7wsj>0h0=5{&xw%)=oPp(Ywq}%oxSHf@I-s;Nr$?XspmTes@ z-~RBjUB1f<(0Y1V7vEc+Fnp_EIR?|YSg`%#iHys#y?hoQ%-4SKy8>I=n&EC6z3dSD#AKXDknrrY&&JCvZrcz@+Y=|q5U+!EilN=fYzkI2g_|3$o&{-;;h`lGOYD}@n- zkpg;!S_W})7A5jwX#Z;{bY4f`&<_1CL+3B@?rD@R3Locar@!4u;sQ)wGJ^7Fu&+P0 zWzqQsXO@(F?8v+1)9(J2H#-MV$)zww9_#$UJTslh_XGs~_*;G{|Fz%b zjm`l~=UmARE(%$Ccvhg&35-hYW^Y1~bK>Zcm^ptcWo1A2?7)&>-@)h@;cN)bh*_Dy zRq~N1nR6hpTf#yBW%LR(s~uNTTGkvt_C~z$+%xduGbqo7Xyd{7$bI)G1=l)?A>D1s z^Q}{wYtVOMLi(NRSqPHk^NR@lb>+2!(AaYf7v^T-^vUBfj5T5(?z^U#3(c}Ypcg)m z)*aj{=3FY?H&C954_f#X{|ekH@GV2?>btnv3SJLjtyS6JELbk68_JcHxFB3n40r<1 zk=4bdfZj=&{lx76PG#T?c7qSLr@&INQe~@_2km`r(LK_|`AM7`I>Ouy*t8A~15=b& zSaZk|OqkL#KBch=$6MGq(FFc3w{t#EQ%77}*^G0X)p%*1c@R8f6(vs^7DT^M5EiTO zmwA*!(@R*RAvjh!Rh+fe#Jg%tEw053_l0EzfzFwQA9bMsl}T&RW&3yzVe%9_&GdjQ zx_H)FS6Xtd(1O*8ihx;!^{cpo>q2=`fhH_-9^evvx=cSiR{BPEMQ1P8YUahjZUx?x zl(j_JOSqY{eyts=D7tuu(ji%J(XIq5;RW=v)mCk3hO^VK)|%s-l_~I_E#s5h3Hx}hze0fy3qdY3pyDr!9_0q|sjLZo?_v&2x?G-0i_3SX{a zp*91LZaRA|s#uG+0^23vtp&sM^h{FdI6rnR;a$3th43nSRFL~#x*?sC?n_6!`(9dS z8t2j~QdD-h(N0?CH|a}WOGuYih^z8POB}5w2cf&VI91`NhEN#E`U{)}a>5tbWy~^< zd|e0JsWa>k`)7^Jyl8d`zOO>Bs=Q16M}CftCX}ykQpy`VwAk`&(ayes*o#uC8~CpR zKb2y6En?5Aa8c=%)-<%)`?_anao5WC5`B06jUx${df-?UG|BzQodrn z7AtHB;XXc*wo``=iu{CDv^Rp=*VEeR;<@ zlz3YD*v`D8-!|p7t8MdH{_eAIbY1EgP{E~)!M>4atK?G1>jo41Mi@GV3>o$}386-` zcK`wLTD-8I91F@t#BF6Mjve3I&&phkC;hX3+(=`;iud-PV@8>R@&ofUopH_U1an3E zT_uHJa|mI`Rck@(^~&~fEeA1tSSURVFE@!WvG2N?p62d^9)N6zV_bw20I z?~WU9I7}4H&MY9FtzI;T+GSqoZjYyOxsA%Mab?A-{8+ zN(;=d{;Dsx@!Wtw0|Flm2(ViI@P$kyT}D(=(5Y2Kj;kJIZ#l=qE*_{MuHe9b2Z8OY59r7FBdQ3j4%-&jF;P;>v^+v zYsC8vg8%{)T`B2S@5JFF@zitA#nZ56@+8#2*y&u z-TKv;SuB?3xGx}t!|f-6#Tss(63#K~(#X3qU;ID-*6Pq)1cV3*5tLRDu%SZ#J1 zVFYeL+fZm@sZhrKOBEsDwa5oc&D55T+G=#IA~2bsh#Ci|uT4Qi=dj)a4jWn}P>upq z^kly=LCTw4@FbDVo16W1(ZTpGBNQ&PnvNPu*d}Nuj4GOWw*x`jzylwRPaI-LIYB-# z3I92Q0PFkz_C#EqK=H`gKZ__4rr|ZZTUx-vP9de%HwKkjR#(M^d}swe*rCDB*F+ozSZmZBo@xrw!m~MiQW!3s zukrmPg5&Qz@kG3IMDDJdb7c0>XP0 zYv(UuDMESj8F%i=b6jxAkN^D7|2%Ep$r~-?{a*4N=Mx6g$=5PZ_Pg^G+i1R*VU}WF z`6J(w-y6?hdV>NM1v8_gqiIp6KvIRiGDV8plsN4 z*L`v5Km1{I?LH9mD74N#|C5+M_AGU7ioubcQ9(dEgW{puw1@&~E`IU!v+=!ee=~Mq zHS&coeueXE?vCAin1|4Y+E#t8#aGii3#D%q8XI)^<#}Jn-*`O^zx-knviiM$XgKb; z>)t3cm$-0o9N~UD=TeaXTrATcqQyFb{dI6r%UBf^cGM=Yp~KU2Dq#B`aM8G{;I>NO z`&v8VHmnJrMGGpEI(p^PiLG*=^$ime&)*1~In z=N0l^M;Vh`f021|ZwTFAUO@p<#&uiC`7U_^uP!Yl5Hu^Cep5YwS-B0DY0!ql&%F>6 zXHUi0M?M;ZJNLwSEK|-MI}#U99ZwcBhd%Xq?7Q<&QhtfYrP4-Rm|sh-6Bki%P0;Sv zb`)I6f(r!~3O6nM>hVbhRWoN)QSn%tJRU3OUWR5=QBLiO^1%KAIe_!p<=e8reJsT!q7%+FjQX z3C7|iv}@#uufjiP1`r?Ii@ft4ajvsw3Sz9hF z%ma(oxNZL^%I3RcymAj^f;(;o0$mm63U`0} z;~yuXt!p9IT+$!uT%jZ@Gf!W@5{fz?gjxr1(wuuyemh`Sz)jaD%P7j-90SA?Tvf z`#C$2e!pzNwUspAa(!}L^>X^i;;)``G8> zK@@0%d-p^a3h#cDIlV0?48fHOd35yl#E!nMIC#gwsBnf_e`gzKhLz$F=d{TSgth%C z{9XUp7Y3Cp(tWM5@>)ke~-#k@Zx>j`Et+GqpF}-}r z&8WK0&GF6OzPxVVSm3r`U!?w^FSOt)=~}Rh%`&}gP@(;816aJGn@XuJXfg!qax!)+`TjJt{0SjD@8D%A_cA~%5L>#uSl(9Ij6pDZS>t9dvIb|5q zLDQ)0RiW>*vKxi#Dy~LHN0W@k^9W5V4k&^KCBQB zm+R@9^e%_`_xau1xfk=PLV+gjm)%wagy&u z-id|3y__gW*ql@toV4T#gx{RNNZ`!h%d%X!8PBpMbh$41T~Pg-?6)%#&x^WxK7Xab0v;ck>c1PQ*vICReu4 z$yQdbxxi5|rl8IE*3AWr3tG*2-N_(~&ChSfxtWmT39H;L-{tqdGf#uh`JSKCi<|so z8n61YoHz<2+bO;)!N z?bi(g;va2N(22w&W^gZb?$sml!fS`))e~>T8g6X%@afKtY8>EfsgA|@SX||7oC-qh zPIe38UL`5GQ0AHSgNY18dr`n~CzSw9*p_iLLn#(~tz|WR7cF<$FRhv4Gun|{{D!33@xI0$`mpgS+ zu+X~Xm-G2Gez>L0#a)jyuXgHe#FNipEy4x_`aof{)`x8^S9avDgU`JvvsNbOqI($u zI`}wBpX|mh+A>x&D!3L=a=7E(xCMPL=(&7MVVLJFty?DP&S9CjLcbnk<4M0erd_-v z)a#>6&ot^rsNcpoYDTcA;-P75Uo`FC6Pqd_42(4jNz%#9dHC4t$72J9hBSDcZwpvg z=rV4e`vQXK6?oQ(GpFOoOE1P0N~$txyC|a%!FYxHZH_E`LZVcj#6n^P>yae|WRo*- znBCu11h6X2rl+Q3>cq(yzBnCw-~$J{t1--O@!mG9vYIZ%l5o2;6@%n6yTPtOgqJIn zKLO7<^7^gWx6mgeL1S;j8H=u@Z9p_^>RNOd7zdgVx5TE-HhvNz_s?hG8YQU>QB z0srERGrCm@n*Q^rKGeOl-Yd2Cm_(5_+X=t!ML@jJjWTf-D?MCv9y<%Y!P<~>`<#=t zcRUfVU=`JZ#J>y0O)pKZpa5w`Y14}EvlTpR+qXM9?mCEY6W{ujWnW8Ygq85+Z!~fK zP4n%XyYk78MLV>(17Y_Z=QC|AFC@#FscBp|PH^rTbB^OpOX&=*V^tJJSo~DTuS_}2 zf;f|pb2`Km6ki=Ejk*D8-&`fS7#HpEfpU3~So5)o-lWEuD6u)99ZMeFm}vni(NiI) zBEYk!rf9=?@=@V)X--8Hmhg;ET?gKfK5l_nMU@J!WnKKCoYFm^iZLy~><_K7rpa@L zO$$pXkk){m{hZ(;eAW?wqeWcBdTMdGP&!Dbs21)HfiH>(HzXvbGk5=arkM(&fEVh5!pAigZUZw#+aFfMl?~z%Flj`;`t49ej^C`cVO|h2c`5f3N2iJ z(adQq%SyN-Tg1{rcZo^4rM7~!2?*SpP&T%-_x=Cuz4?=z$9d=ZR8@ENeIK}iZUP{9 zfHx_Mq-ar;G}6qDwd1jO!n?B(``d2JZyWocOl-u4V<)^Z;aPjep3zvgZSEZMZ+*Jx16b>XW)GV%?~{<|-h1 z3$7E-&l1B7StlJSdOZu7m*If|{0`G|h6>=j#`s#ByBsqU$Kn+ftFGcV6-Vxf^??I1 zvECOgE6B+5Kuq)OY$tBbx{*Zy8gpxSumG@KyS$2AJ{t3-=~!x^9e4C$;WCKD8Q@(f zyx)Z-CNbVhJt$}Ch_|GhW+;|t0I%n_Cq=8{WI=bw|0;u=b2y(+QL8&v z6}Y-+%ZtPWz*OvKx#DA{BDKck$-}X5nZB4*gdQ^&&&9d7 zUrlZ+F<9bJWK-3}0BuoiCk~J9`4~I8Xrv7pi=#ZsTX)OuoJWvF`sVqLb4ib_uUs$g zo!{hSy}6|YDag*o{=$3m9N4|}>>SgD8oop2pnTvvecrn8SjD~ofneC!*jVBR=b~PF zZ$dIaA8B;GBtTW9vRjfB766x4SAbh>gYbGEw4rRJ4!|wO7`{RI*oqviARDVR#QO8J zSzR3B($MGI2D@+DszHG;iHEgrvH?mInci73aX+fuTse0#BhPIOD1^6-fGmcc3kB;Q-?s-}puv>}P?dpv?l)Nz%37 z$k!Ub*?7+99o*;S;KsqPLf8B_$WfR&aLE&g{7v@?-YlRqSmr=U0L%OcK#eiz%HUgm zkE?)up93%_#}1mDbm(rPaq{9ja=8R}8U?p`b1;?Z=H$@TM|KXbdN6O&%Z}sfq%jxt zBkUW$)p)z*cKb~w>qGv?$#+W+%V!?kJlB{XY2xJD4p92Jf=XH%P&p4!9au_BCn~xz zkbk7R^zwbz@=E@GbARhm!1Z-i;?10T@um3HU;H=@UAYufC{?y&sdW&`m^)Bt^t|~R zS{dTgF=1av9+Xf{w&H@Xz~sELfWm7Yu)qx^>^iIFT``}OC(hh|bIs*9SUD&s3^YRC z1ff;|=@u{J`iXKUmrddnSp2jOE=IA8n;hEV`x5Pt#uOX4+o|ZX>hh&nLD{xEg+<%! zrmIE(59#2)FD4z{SE?`W31m5fFsg@+NA39O>nfJAT$Am}ki3t;_C3^xE`J`HUWvPw zSji1=P;q5F8u<;BlW6hZmx{*crfx4(*Ww*w*&I1{FV~<%EuKHp(;@efUnzm?-1YGjTOc|zGVz0xp8iz5*JZYpU3@N4>5Yy$Zv@Y(ZQJ(v{`bF^#wU(l>{~69TVt}1^7^&s^F4VS(%7$gEgxq^+qKW< z`t`iZ%6sp}7&7^L?pJ3o;d-=!wO=dXCdwHA zpeoA1scC@wcMeDC@G6w_IJ}R^4SQx;n>GS8}2$p+-ECu*3CL3Jkm^om=5}39!h@nWOK~B5a9G5KPN3pGmw0k^GKe znxNVuFYucbA4?|VG(k(>!uiB&(vg2!)~(~3_smPr#o1SW9&;DZBvAS2E6*pFnEktm zCx;8nmYxy%zxjCe7e6Dm&O-EUM=`PQU~D`17-d|+LXbrdfFRR=Z>`kj5+K()mSoAg zY_qhfoaTah5LhY?0aA9?-3_i@c#G4xAHxDm0IXO>VLm*La=RxM4*evS&%KJ}*1l-p zav-LU{37DYq1bg`D84>+dyEWp0Xos!Qzm1Cts^(i&Q#*($5-R@R0Uwdg#z!gw%L(q z1Z`YMAZ?RN#04y1u_jwQ`Ft!+9ASkAR((4kh`xjWIA*aT`PtFsC||q)Ed(fBJF_jS zgD6IOABiDkTXh+CTErHcop_5y18-rix=i^-qK!Ov@Bb~_w_)|k_IDt~>~AN;`|#Gn1ypQYcPpS&`e+J`Ph*BC=|j|{{jz|mXt0!oxJOwZLP6q z5ResuHoDKOF}BbutgoYpyp~hz$#!Bn+gJorLUzw$y)jofAKj-f#%y^wf&B^KlEs?CE1g}jgwlHzpk@V^ePx(TUaND|d%tNtIZt$f;@H?&DnkZhtRLr+&h2u_ zb!t85#hI49G39$a=e*N-qy5YHcs*8;_xla!tGwYyxa8TlTXICzx{2jy1v-} zaJ@_CbW`qq|Sthc&w5lJ0KTW3@mA7B;={o3Qsdk)6`fi<13 zPkoo=6Xej^@elv-4^ue>g`GdDSe4hk?z~fALa!ovPLWR1RY2r#|MqXMx^%RT@}fx> zu-azw{4)39lB1b!4h6D2vtHHVSa0&Na!viwpZv+6BzdJgvAw82Q5PbJ?6bch4x#Z& zm3uzpd(;!_c;m>K<`TwN=8@}R=Kn*#v{4GusYl;i=2gANBT3ONT14m`YO%7X^qowvq3 z+~}P5cr6RsJjn6910jX2=lpJ7v18uyM8Un!3(Pop%7ZBHca@NXAj>4U;)KzGl_|f& z`&<>YfB*he1}7G};S;2CFy;MjmeW;p(!hbX$G+EZdtI8DSLq-?Cb;Gbh&K@WZv*xroH$2Te@3*Cw%gRbjp*FJV};DzF*MKm3z87 zloolA>UHVkd-C_JBe!ew)tJZT@6VqC^2W71;c;#swhQYzwsQV*zQQGx zIOmTXi|5~dD_%W+Dp&^_!yBD(0GB8SnJ|x{2;8_bi-MvxS)>$MHD4;@T4jmJI1_MV zZfUi(j-||+%1Tzvr`S`pOBg9l`mbU0&z*qG`6)mD&@5C?x~`#YEKT7@o(lqARTPnx znK@iRVFgOer8>YR#e8xzL2utuU6>~}3ht8tE|#%mTe*zo&=f1Pph=Z?rMC3mW}e^B z+bd_dLv|60n4_y%p=j688%9^iUTASS$d^Y%2VzKa{7b8n1az ziIcV`)}5meuSGjRWe;uTJYd%(abaANFw1rdbZoUyj+24_D1wJjgh<9x1kB#2$nETrOadvhoUVi&%tfR=i{q}uv z&pq{pC@R5B^0rD=+d*T>eV6ANd%?O>nG(_elG95)8{kH6onX)6b zQjA4G(<<9K=d>_fV{DKtpB9LHTAIarmGRglmP18&lSviN9;I7u_O z@!jCPQ>Twa5v$;~lP9psqVFURl^PaAAmtZjX^Z#sHZ4@WwuROx*!BXJH;!$U9V%a)XDADd)igE+s7%|i z9V$ceIH+FO`rkb7X*}mM-~H}))0p^0T(=4e2uA6iu?4x@yJdT9-G4C3+p%1$_Tl>U zGIdYPH8Qt^Ou3B9=EHNR=`*l)tikJ7CSn3NmPKeejFsjc#49s)hU2q5mvL^H)!*9gQ831-NzeYc( zJnchHZ5tV)%(utR9oyl;`kb(_&D(ESH`2oKYNmn5Zq~bXp8Jt}-8qYjKI`9Wxu3|z z$;ZB1{&1_ysdwe3JmdSMy~@U;M~^13!1YN>HA&C&N8&9kXOHp2469h>L7nF zk&?DlqEYFhuodgYR{GRd;-9q+jS@F&0RBf_Ezm#F&K)PN<08A2F?JFDPRKpa7XU5m zZVm;=a6zgUjuGb60LDcuw+PNf#h?$cpGyE2pf|s}h=tfge|~L}*W_o*`qzK`*J-}* z{LsF`P2P4MEp6mU=ZEz+Hkat@bI#MHwbljF(KhBhKQGkH^UrI)-8}xyQ^0z%O{fR3 zF8rf>ylu+gg2cKW zRi`JYrLlneRNJWS(Keoe<7S(>Rk*2H&aWZ`>gdQ$8pJ z^nM3FuJ&<2>^1#DYc}t{j|V415R z#>U1{UR1`J7oYi}r_2XApO)=<$@?7CN+-*w$+EPt{C1RrhE7(TkPG-3r$kpPCOb&! zFJHOkx|Ke@x0$~96lkm`c_bgZcguB|kFVW(-Fg?0K78azyzr~%;tdop7g0!zp+dcf zm7({sD*QH-ukDo*JcUyuv`s}!M4WUNa2eFPRCjY(L7`V+^}I?-fh}VQ)KDs3U6KDq zWU0+&<;wm7`CVH?j+AiUrJ@0gv{eATa?d3cc)EW=rHq2++G3=p$;sL>gH4nZ>i{on zD9Be)+^){xh6x3riige4l0l(JWAIAZf-a^4Uh4Om|o>)Xtd6aD)9*BqW?`4&2Nc(kvhot5J1RX zD6gLG1is?_7g26|wH2k;xypL{dR!%grpfCG z+=@NJGtZ%@7QpbH+#7CzCi|i3!J)x8uzy>O-mx=!_wA0py?4aP`Stie|HEI!v5713 z_~Vbq*XWB~)oXv6+^X@e>m}t)?pLmN{lm_Ew7!})%Rd2_7J$UDJ-cHE3xU4ea#4?)<1iNs(aZZoorBxUK8MVxaQ&FS!g zuF+2zA8Ucd5yr?e29p;Y8+&9y41gkm^Zx9}ca60Tv%mBFnV z$EiO`FQ+b{0RugRadc!gC0}I-r&8wAAqPG;Iz>5T68X8 zHPyc@3gup~BV`rkC-15Cx-*ZY^##6v_LW$@bOgX@Dq3*mS036!d>)cl&M zPLm1jTAe(e0I1UF!RXunK=kjrD|!GI)SFXcw)(3D@wKGU1ztOdjK*CV;L3o<%JM`k z9s6%sCm(~@^~D-mj#^ISJUo_M`4*5_McPb@E`52on^r132$BKML-tfG z_^e|KR%Rn(seP@_O~lMg|0x!a{UTX3R;G_fCp_JOMO=;gS#vzW;~UV2|4|@@n=UU^ ztg2wu65-ds{&i9gIY)A_mh%KXLVWX^-%PGloofjEI!1Q8UQ*^{<-B7mH_s{eY*Rn} z@n2&p_7BW2-U0-eqRov&{~)g9@47$Qpz+$oV$94gBp0WGg&4dOFYIEx{m###ZD}(4 zySo6lPQ?q)JsVTZ@yw^-+wc6&?_7;-lNDjt=1+1evu~8@oKnA<#(L!2cl8epVMU3& zZefudbIMaM|03FuDGYXq<%IjpU3cR0ZX0g!aJ>r6-jl4XoczEBmQw}2b2x_saNK=& zJiPY+7M{eyBSzXht~;-sJ{n83{mW-g#nJ+9_vh#0k{~a0R_7|W-@c!2?_b33UG$W+ z-3s|^O!gU#{f2d5U*nw6db?h~;60|sF>XFi7dHQ-@9_@b?{A-TzT`aD-_EC8DX$Vy z-tt?{rR1@bCr_ri==gZ|=67^)x*C%#Y8nU@TEgGvGv#HoGPJDC;8aTw09Su+vnODvvA;MUMK#t`TO zSn!hM1m6Zt1H%_E!@?Vx$iS2r)VaodnLl~%```b5nmhmMSHDUgTjY6l4T2zg1JS*m z7QV)zvriG|kVek8rIGY=uI~LNpEYh-{zf|4{PUSmKpu6oZ6w~~tI9xQ4tm}?7qC=` zZatagZ{?YFncIQqy*Kl4-h1A9Z%khEd$x%jC(rA?-_7DeWT-b+lh-1o__l2G$yd$b1Y+DZoA9+S=((h zH7U@fz?Yu_*NnQq`~|vR2^@?lv>belkB_H8h3LLujbN7pZSOJNEa8^l>;Br``M5Ff zc|fJ$H3@QgE}vJR=W;bZ=erzeyDClvjDu)FJV^80#pH}96wj!)XV*#WvqZ)qY3s?sZWn!28JRiYhh z_R}rB-Ry9k#5mxUURn!UKYqjaStsV>MtS+N(DJL0PwU#rh4tpd!#eTUfsek*!%i|{Cw=Up^($-+%Nn`Be*LlVJ-q}3y(J8P=|BwDay$W(Q zlqf+Aa&Zd$)wqKyb7X&-hH3!u3}Z^a>Cv~H}6I#6u3 z(FO&&I&ddcCQeq3RqiE#g8@D;g{#3?HMpAzuBpe$;X5nv-8%2T%==Gcy)n&we%o&j zq0l;r<<=Mq<*g{TbR{RKwazn(xHw$g%-<=%t+!ExA7T^SGM3kV+Ibs%?e9HUpzQ%9 z+e#isI@tg*`f!aGeO+;2pfmo-x4#+Z0Dtbf=f2pzXDnF@)w2pkY!~G7^GeD;zupGG zWxS_)pGcNCXMLgO%PMwaGvRU)3(IBbpxZBF!E~Z!ZtSXtH9IhSNPeI=HERV*KCCEQ_e!CiMBZXpM^VMQ^9TSi>P zVA)sH3TtT=unDUqK+6Kt`&*Dp=oDmuH9}btx7uoKDtd#qu$_ z7cK26QwtzN8?MV}n+4i-IuHLgQmAO?qW=LpkY3eb-hOVr}{yF~?qx72FZ} z{W4%&5zyT-mixEk25~>`5N{)%(00C!Ck67C+KC;j{6_uw?>%Yr{aTq6!R|OJy?@sMF6Nkybs1H8O+Zx~4@NzQK0yC9{dtv~PuZQ?*!z>PJ z-#!wRePc0s=6IYrb~uh5Jrc9Doo!o2>G#^0lK~vtt{VEftL1|)8dE;+xyHI^yr=PZ zzW>_2{CsWl9(h6jaE>Sd;Jn+-x^~>`{K;{(n+pZC-t(N+!dheg@|VAinaN9W=G5_c zcx*Jjw{J`8JLg%rqAOn)T(}UdmH1obPOQ&xN!iNWwS+~T)>{PUOQ5fAvWw)WMC`~? z7Z$M{b%4tXw;4IkF6rWsMFp*WxF_^^7TQDyG34m`YqYymM#{NCd$Lav;7S~09WoB^ zx-LoA7@sIV%H*x5t1|`wA=c-%Otm1v2m3-#eGj`WSyJPvl?kvA&d(p3BMe*1Ma(uRZoY`N;Fm8GV;} zgq&W){vo0eL6;kjW&G-_}@W6FA)+%~^zG;EfqNr79H0=ERfl|cl}QWbg%!k_)@XUXTa z14&mSDiHHvArCe_Po~HNmb_P>e^~Nfg|&j)37r;1uJFn4aPOw6u9H+jzUQ8ME|vYE zhaO4;Gihb=d#)I=!_Wdut1TzD4&EHp335p@ll1y3rA((A(cHnS0GFGw+;ZnCodiv# zlPj#Wo|C=~POT4VtTI48%bjcf)>nysU*@tX4{RS!BAiglBn-!=V!aFc^fX!2Kx5~j46wPN*@E!#`IZ<7SGe-|&k#judA#mg6>1FMm(DCVbuU>bW)xG!1MOarWBQ0gQ~`7^wK0fki; z3aoJy!-7;_!^(1yJPEe(S^%9|Orpp#FIwJAz}G%^4(0ttj!h4;@>|QW?Eu*c6yw1* z;(YV~aIC}h3(EiiDDm1^6j2=65l?;nk*E;^sL(+WdBC(JOOPXp2v@t+t3T2=KC?f3 zHhtL&q1?*0dZPVOXKCY_mj#>KxVaOBVL4g*tN=!{PykuEwx|UrK**X3Se3({K?wu_ z$TLe)$lGcZ;i2Thjc<41R&3AK-stLUjr)sBaT)h|XP1tl7ww3xkM50`tvlmz+fW?6 zJQc@|V|h!Qlo=GYE@U}z;zW}F_7nEuZh3;-3g~6*qE_m<3XtQtV183kC6LvwQVJz$ z55N1lXOO;ND`SaWST5}y=#K;A+hfOrSOz`x^;jVu(&4_^U0fn27YhUi zUI(lrR?g%}T=HQ})V?*Ax^7PvM^!ANAa8?=tpB!+y(=UA-B1CW!k4o)#?&4m9e|1_ zxX;R}|G#>yA~(?%u(`5~3&q7Nbs$LBdW%zlC=(px5R|r2pgko(3B|N~Eg=M75&#J# zWPGchUH3=l&U=%4z=8@p+U7bS(0Uc{um%``J4EACl>oC##ZKtGg6p?7ESwGihOzp# zV~Asb$z#6+Jkm03CIM%HRW+=<1ldYmxX&Ek%R5H67x$Iaf%!}B0pSgSuOfwBpSu_p z@{g%U0+s}c1dOz*YU$mY+Gi0rhJnk#R$_vAJ@wBLP&%^$<6Hj|9^;0im6%jZGg$c^eJKh9J+W=LpIC6+^a+RJ{)2bM|Msu`6_&F5V-f47 z|N1w76aV+W`8R1ir-I9vPg-BtPgrNxM;cFDYEU2ii z&L$vnZsr0!H_i%yQQWoyp1?=)z3r#|!D~Khb#kggJ+=b|JS(21oM&z1lX z3s~!xpm7VQQsApdf!v=pmd*C%;)zCGn>tF{jteOSwOm|~W7gUK+l~aw+?2m=&D5ko zlLB8|3fvL^mxBifi3&M|pP-F`&_Rj=$qYJt(4hUx!~&MXfwKZV3-w$!2T@*A$U8}O zvT+1AYCrtp58nfDIcRbK?usG78tEmtB^a1jL}-mqQqnDh-YC(}mK_y6hk>i*@L`9FVy>)Z-o|-UBEwhYy{Ik+~x=z{D7p8A=Y-R!&M9 zCMGJc`0q42&sTU|{Vq>0QTAwjW|UjiOzvEmH^2`?dv+wdxWW+sO)WFkO^! zDAL#`p4YV-?&j73KH9n$qH~a!qR2EhPz7anvIeR%Jr5!$kUQ>e1N=$f`mF!>=`4Pf zd;W7T=$A^*-k3uIc&m&XR4)LZs4Y7qYXEO-9tSwdT@VC;T~_j&>top2{BE$f;(+u**fUAWdm;i=VW3Cw}$NLZP`V`NM>g&4ghaC8z2 z*AwSg<4wS}-SFUTt^F~0cXt$aZ^vC8it#R#WhiEAt;EMO#uZjJbr+T`v3TWDY#ezx zxwC5pfT2@D&ej(xy@zGwQ^yoqQ|0zxU1~wcv9A9FmeRG&ef?VfoYqVNLRu0DZgFFJ z*4S6ZjnWFKwz81i`l0EM*5Q503aW%9gjPw3hvgPQN5J6pF2N`Ax(*QFQmF)hkr&+; z*02cEMPQ9K=DpUT0G{`l7x(LnfZCZ>`K5?8+o>`#j?zNug#uE z*?onq(B5oQT+QWhUj*dZC|Ew|4e|U&3t+XtQ?lB^s!Piqf#^ynvDYZ)M@<4$)(6!S z1?C`K+iwF@z%t^rwP4w@f)&@wxz}U<*b9_(BTig?Cw^Rn#~ov~}{DD8429)IEq;(5&{7mEVZF6eWNXZ}@wIq&-@is-r=p%{?c@m+nKx0YnW zH0^JB4qz8xRp2?roSV4_&n`#j_B#P?i6Pd9`*&h#87obftny@?_Zmp!N79G1;3`FT zSDCn4tC_pz{JJBqwk#+jDGvVBsZu^}fP`coQw zP_jNvE(mk}=&?NFJW_?E^KY;D9{J3q_mJ(|cW{0_xqM3}`SS|n=D&XN?Wo?l8so^o z!R=T^;kvcPVw6^ZK3%#N-Kfh#nYdU2&d390UBULrmfU`FPy0}BbdD%f0F23E8y3`_ zD+5lnbRjbU2UEN)FIomS}>S6M=#vIx{Y`?lC)P1FGq%p}GdgW0E5idlT}yQIjH)}zx>NoZs}n1*=tuhXzu&q zgAXQ0zt_E_&zICEcbte-}I&B};v#zU*eIP)o!ou0k&@pT+fCEv}%@o|vBu=TX?dxH=!t6HjZJd%jWYi|?T1?&BU*?+MVF1SB{Eh^6(G&u?R;H(}{h^PERP z{}PJ+9>B9<^4yKGtjs+rRuwMYDp;dbaMjteh}*5XX_Rv3q6iqWfudgJToI+0TJTy@ z&M`bAu9f=GI?(kw2>`0Y8nFxlfEB@MHoV`Z`m$Xv0vyc%_{>ngS>iv<1L`are~(&0gUI5F1EZZNk|33U5$^tI7ila557)48 z(^AOu^=%W#@*105Blut;Dcu-*ynUVOy}40-}ch zHvr{y%~xHXCe{_!(SkU$SbAYGwTw%^Mcnm)XeDqdfoUq0d8Jk_T3`8IEwWPnR5Ua8 zssSRj0zP$)eLaC`$pT8n_W*U;(H|RwfNA8rO6;zbciOby6)=MU$*L)VNC0p}+Ftst zayyj`Fap5KGPL$?!#bpHCFXO2frtR|N`7ljp+4F)s)*G{OA8BQh~3nM`?<=leYiv1 z8%yU8#lra`Sp7`%KBWx&io8icBELI^cSL#YAVAx_EYLF_SeHm2lZ|h)O$nma7mffn z)8>qk2L1~9Egy=}-ciaioZ^kGoP7)4nUDEH<#_ATnK-d;JZ>A?m4dIg;W9HThqNdV zlyE%jZx;xD_q*Rs^8f)b$Fhy-YG2=Y@T(;vAUv@SFRsilBX8#7w(SqcKl{Dkk9+UFlW}w#@!E9fxRLVc*i5Ul zKl-CTN{VAaE)`|Y`y9`ia$C4jHsx%2akC{|oj+b-0o0`n=VEDk0{+5EbZ`f40$1kn zR~ayI^y~j3y2tOw4IY3m0GF1nTCvMR{7+TqdsC{PhV@vS2oN@m`^|0r?J*2U-mS|* z_+k}ceQIhlx%C?z!Gi?z3+v@HF@VmZ5LZE-=OdeM{aki=e&qbnd5xYf96vjrHeQi= z_L}oh`AK(CTB8^WYrhfx2r#Tup*P@@#!f zYF*QqXo!I6wDSUTrJ!6z&L{bb04M?wQ;=8(caK{ z^EwwtxJbo)c5|y9#ziXjG3s)arFu%zb+Q1L@3Fk@vs}FqU7F{c6lhZ5t4D#4HZ%K@ zmfMvx3Qz^4?&4g5=;TH>at@?j#pj?}1-3%aLCCF;EUUB;q%wf5<#+OG`Ry=r$KbK_ zb8ly22jW2738(`suU)$`?N*@QwPh3_k)DDdPWatafC+dwvGbaA8XFtC%7b>ex*M?5 zwu5#xto5K9P3y%KTe%*b==i=o7`XQP&Ero-0qe!hiGl+mR|Mr%LY_0egdn9LmOk}$ zL1m!#D#|6}K3ti)lB^kb?c9~xgcEk#iS?$U!us04nxTp-!WGW1a^7if)@gjQTz|=* z%7srFgfDqnn%VzMDBuzR+mvmu1qD>QATx@wib|_aR%Rn_`?`B#$LN-rAqL0HJOBnD z25b6oH-t+#o-rnttY=)W3n;7vnLS>nZ|g*UZvg+o# z%5vG2M`93#o3XhBur9VDmpQ5HIiDEC$0=5JYKF?&~6PQ&8x7I-+*VtB3M!VN~YmTyA zUL@uq)=1MR5tleNZeSvs&r^Tt_h(&>RL|B3YYWKFl?B{O&aK22NZpQ=!~n66+Q-&X zT(%aJoP`~G0Tz(q#JOrgSPQP2clnPW>AwpY1UX#H&;=i^0qi9OCg-u4NdQ+FH+g++ zEA%aZY8zO-#B#I)a20T?wY|R_OFb>Ij77!*An0_l91DPLtGGG4L>#jdCr`%3fB0{4 ze3IBuLt`;hB*xYnu81IKiI_~CV_(A+;FV47-{)bA1l<$oeH1+ za16hv1piv5)Cy=50w&3NOOOji?nbio@|@r#gh0WbESq$12(KH%N>IqSQMw1LTR3&4 zV?iO^`3YvNoPQ&^0jvXOf@^gPDJ{2rpVk#6fI5wHb))AoKN7D9i20o7w7SyW*al^* z0&bu(=KEA4ZBF2eOah?Ir+1YH$D*}=2k$q}fOJ}dVJ%hz#H?F{@m=dvg?Is%fdv$W zv~vMFKD1fi0?n+B$9-T0@VQp%!t$=Z_{(pt@a|PiIt6-_3)f3rid9_yEpwm0jT=;= z93{sQwEGTtp|h(L16zipI(8dcZQP`zc-NB7cx5YdQvjb>2njA7`E{&JpO2M`xY8Wl z679NU<6VBb$i4*-#dBpq*^M$h39l`dl^s&Aa<76ZA;S$5G-I>-aj}T zcK~i3Jg_$ghTt>mTiU27(lw#p9h^5gu6g2#Clc`G*vR;!|N3A5>on$d%zF3Tcc=N3 z^MX%0C!j{Kh{2U7TbZ^o(BB(dSva(3{{d*$!J;AnVLVAJ&f@9~pmqlf$sT?j%Prz= z?E$dr>+hqzCf}OS=3UDPy-s}VTi;4^9F=1#&9snk>?gpI7dBq64m~H0O)fsLtzW_g z?u7|r60>q#i!IxSb}@5};-~{#!c$WZJN(vy62aQh)E& zzYsvSY-QokXkQ0lPIrs|!t`RvwKz8$bAaaCw{MH@egAu@M{q%wz}A~@zM1B?jz6V+ zT~=Lv>xcgE{yc~A<~+~vT)x)$POmo}U;BZqR1_o?U=+Y{e&b4e`Nr|Ia~u`+@|g;I z$Jxe4(b`D`Wq(h1+_ir!0iVx4_hS6r%Wp?3@}dvgoIZCsS;_8N9*zfi?-t|8!Mg$f zBb2d@-K;bE>H^0_`qd3Av|0hHI_R4y7WoHk#saJjHMPso9ODwAZ%s0OAjd=9YN7J$NQdww+bfXT>!I+!$YNk2`q?Pov zGqux}Hg2v;mDaAhaqhm_tb|dB~Mcm+K#T>bc0u6kxI+C^HJzU zv5sPK5GD1%;0S(>2BOx2+o_`$V*SEgRB5wS6k3;Tk|}t#n&`Suw5wUZ$m+*>Ov{t z;%-HN?5>PS02kIxYYWT75WyFGiUWeu9=UHSbfK6;X2W2kc@I;gL9EG=3`wVD9Dpx##jXI2(gVzoFKOZ4Rx%20vl zk_8^mXG=8n=bPohC6@J$0=u)LH9Cot(~9*#`$B6B0Bp6a5pQh@uyqMKkcT!D*Sp6C zi7PaKyR1GGvm;T&C1Qo|F18QF&t7^x{;xm$f8vd|-%8_z&h7i7|L!M=)3yf}eFV41 z6`xj1>oaGu{&_1|K-I8NS~)irYnKlv-Vvxuz?3uqE1o7FN1PEOh|7&<=dGiWTF^xi@0&?Z2b%yT~i8 zeZUi*Edmg0VWl;ZZUwbO6XbF)P*woUF#lDatIS_c?)$Vnvn(}0puqA=pv?RIp1_rs zWz|K18=f~tmH->*R=xa*4tzc(^O2JPUp?i0zT)2cdN*;jfjJb(_Si-Ypt6=V(&*ir z-t$YoFN55*18fnRj(CB%S*7i_wF`7r5-O@+nD~GHAm+~^FgPXZo0R(D~U^B;j1=RJ=9t~bWkqIh{tFyApcGzG+e=kQ79k*ARf z%##3F1z?K;SMYM@*4uGEi8W3;@%V_nS}Fpnv|*`)B~}jv?qXp>JAG0qEr5DIVdR+> zt_}6znh;(o)0?caC}QF~mY`FY;_d@@(YW{SxP*1kD=)v2;sd&>U8SHP(I=sQ>Yr?H z(8Vp&!M$VSJWhUpZm)mFIg8J!m>1-_@4oxef<4FAzTbQbIvSIBe0)6J>zkbObfW0@ z{6Wh3d*AzJ0yNK`pNJP;dL{n+l_LPgl{kN8HoBqjLBOLD0NF#xi*93QA)l-8&PEA2 zqkyJe;P)~LELAX_kE5Ox>Yg4Rti^Mrg0GF~$fIZ7Y?l*R0fw6+%GiJ0f z18!AuN4bGpQ2~1U`VM&H?yY@s@Ae1dUq1Cnym8`e{KudDI{x8>H{yl2kK?Yl&WD*= z>K}A3>71}1%L8e0fkn8MUnQ|~!3>c2jI{K8u9y6tkFxh!lXd8K+&9zBp+Ig&%AHJS zU33asIp0_RfU!uIs-!NbP7A$L~CIy-lxV0(pl?J#JunJoRq$?I2;EC?5yw0uxt~c1Y z6<9*LIEZ$IkR5`@PLAvdGr*NQjeK4D$JbtaEp_BR<2|m9%`R0u=lAkt#d^qme(krL$JeKTG;{)?>m30t zX{kkLHiK9B;Q(qY6N-JTGEG)kXU@m!3$I3H;u4cyCdmtP5i?V3jysfbnfUB$(4NXuBEJ3Zytm?j4Wpy;yTaeXV+z&*N04$x( zZABq({H;~mwf6uyrQ;kI%xl9nVx^FWPTudz{N&1yyHOP)56m*Z0fCIgQ~?ND!-}X- zBnAop1iWj=pH^f?31CD^89^Zm#>dF$hKj9JIR1P-$r0} z)-1r?6%@Z0v6`D=KPSLNSy#DMSwpGD0)Thr;%8e1^KP>Kt(PSx&03h9p9OdTa42Fq zH41ps)4v_XXgTJhBc`d7`IcVxD=|mC%u|lVRopJluErt&o|b93zqcPR!e;~B<#>2M zF0Z!&9#j|6t*%AeQfE|%pHoJ`twoBdjFP*%uQU2aa8tKyXB2jhN9@=SLvD$-YFq58 z^~7WU9L4IdeicVvdx>uX+#GoYHaHcP5^=!>#)!8ymaIjz7$GCLwgW&)+zAhN4JPX) zfuu&7n_sQ2v{b5FO4Y5U67U7@Ch#f&SttvziW0yo$b;}S1!Tu>ucyu5w1jj&7Fbw0 zl{yB<0&NqZX>Iy6Zt#vJU`w}n<-uJkR+iVbb}0&q0Zye2Fv{osrmh6n=O|fEB;o$KG<1| zNA|SE&H=`M9Jd03v=MKwh38VeF&0<_ASrjWb8k7i*tf!ylV?xGLf4P`Gz| zsuK5`-~48pOKGL!7&VVgCB-LAY3_lm$~hJ>Tw!72@;t6S0sqFw_rwquUC*KDS|fJe zli&aCc>G)6jj`Qh(F@&5fPz}T)$LyDUzg{7pGjqz`O6k&0t)6?g_+|&7eRVYW3rwX zRyX2}3&hB~A}|8aEzQN5H_yj3U|ZYpZLx;DSS=6>3b&&z?Sj4VHI?1k248d#SB(1V z0{HI3b>d)8nY`jwiSpRj`2L)djOU;Q&{TdZV!b#EaCK(lOiW)qN1wrX6It}mt1kki zx2L#I)`tpnBOOvZl`+q2{ zbmB~s}+a9~H5dO~ncg6}brxg%QtI8Q%Exz{lp?LY#*W=eOypY`6s=RfM zn1L<%RK8UKtb+Hcr=CjIlg=HT>ow9p*H@-_vUq!ujqTKOWWvX+3!FTmB**lKc(02J(=Q^*S}IH*+E-l|DjG&_QuTl?~#9eW-;__f?Q>!QOr zTra=;a$4b~8%^DfxS1SCxN6Ilvv%YHvv&R_-`h-|i~>#?90cj>Uz2?&BTgpW3pBbp zpjuJA}fbL{ycJP$w$so2f~G zCIvn|1?aC4d{H}oI&B~L0yWAemD8JPO^Xgv2TJ=cR%?$H+T(O_g*YyNG2FMty9KfY zruMTc+%2cI&G&dspd=?_bM{zxvSJLbO@IqPp@D3lRo1W82VH6EGgqOvfZT=IIta0j(s;SMHAb<9 zsa1MTx4;=m8C*VFVu*)gNwt9x{Ipwk-(+kmev@%F(4ctYme^! zff!up+$swmPZV4j-Kqz#fsKmNswSQ|AySCy|s~13`fb|=}v&%hk#}nU; zm5#xfnOlt0hu(;p6K_I)EJV6SqMiJuRbDJF1? zXLPM8X@-Z&@#xO>*wU?4jQ}-GE|s~lfbah;*||uD7QX{E+&k*hh9~&z&PJs8h z!|zEd=?#n>v()JYV(b+FKS!vpZj9u#-kF)b5EowlS)4nL#mWlSBFs^??A#N5!=up) zFm?Id>A1w!#=EuMm#Hc-19A6S>TZvYo{m_+dP-OBj!9KwDaVc;J(|X{#uai7 z^@AV$Ah}p`(V*i}$GI*X`ZUQgue`K^(rk(NidD+h3h{aY1$8MmG`ckgp~FA^-QSOg z9(fd5&g}pW#_;<#ObAf6(4~RoUn`H_`q&H%mj``AOy+J|lfqh>nksCx9z|!g_G?9+i~xkoPX) zDPaxktZA(H_5y7E{{Q%U@yI;~;!pql$AE)a!a<9fdEBugH!e)g#tZM9h*|D``OxwB z`jbmBe%HM*2ryPEHue<&HZ2WP9a?#r>G-Yt!+Qt2;(?v$7-+BMfni+B4#i@zJ|We{!~`m zj|!Y?ov4hFX9aN8s|eb%fRhh5J9JmP2)ei$MrDF^;R-MZBOW`!$t%DFyIg%LU;A4g&l6Gi zZq2&9ew|4d>%f&j($0aJ6ASA>YflGR((l=y|2!ryU5+gr51|0*XH|3uE>5)fC~9rN zEk$^JKZz1h?KtnlIXkBnfjR!Y9r21*Cw=HY|t`aPQ3=m1hhh zf|%5`&+ol@^+-jRZn$vNmR8bR=e{bx&12Vi8-K}Zq2QJ))p&Zq9l>R8nl3Oi+qt*ccE#yQ}zE!)x=gfgQ%ei~s7jD`K zv!1`2=)-|7%ydgQi$&8U;MN3ITNAkaGq%+{mRl=;g#tiYZ>=LMblwRW}<^QAl5hq1E4#o7iIH7945 z?Q5zwfVZ9)zRF8RO8{)pJT<=(#Rsg_OA6M{T zLTk|f5)W+c(oy0=y_4J~u212<4GR=szIypM01hs|cyD!iKGvsBB}=VD5AxaCzmwbG z5iD?gpRNwq0J(I(Xc=0KIkx)&Tse-V@9VlS0dusA>IzmZJX^)GqPjQ*4RlLGZ9AUb zd}n3uQawf&?{@5^`@>ROFN;yMQUgio+Zx?1yNPww8Jz%RkX>xkf{XEp)_y2*PSsZ8%GnbDT<@ejkL|xB z9(eSL7~Q^;Fnz?hS_S~XP4e)z9Wk z(}g6~D9dMGi{ixLDBt-=v<&w~5BCg?xEfmPqShF}jBROZBL3?Cdp^z_Ka5Mj$uv%K zRkq_(m07wpdg`gC(y?AJTs-J}%9Itbjq{0g;bZ)0R2(~g)-qpZn`Lm^JcuH# zg>QX870RZ7kt|}OeXm?R5yhoT@XsLa47#^4hg`z#9{iWAeCPoZPa)v7EKaew055xS zPdJ2p8D$gT>ePa3Gq0I6nZ1m^rCZCw&TTPVs>ab*Ux;adxfPUuy*<5*S^EHG2b1-g zz?O=0%OcIBzh!oB`l$6Fum2_&daAf|Zmp8jxI^-eK%z=i^JIJSo8FT*&-w-^L~@xmhUs~XE~TIHvcp!(4;_<0u2=S$^%@MRblPcC?plo%~Yp=oklZ#HWZN7 zjRRj-tvE?_bMWfG;HN+RY3lf$9J(sz6caw(9(b<+mjH~bH}~(~p9a2m@=ky(R8U>WHA+e zZB=`$HRgIlzj!@1@IEcNJ}6~?U_&b|0Fw0$-pt3VfIpQrEJT-9lk38SjwwG-<`t3i z#SY?ev2xs%ruT(Z0ur_n{>vLFyZ)}(F;XIJ9<)KbjwTVQJ)Iay_2 z;hqZMR!!5d{DR+T?mqlw)>*DMX{c+#l_lc)kY@}-0OVR?YL2*J#6LUNg{25cl>pv6 zVAeDM*9>(thr73R%b~0XRMpcU|I?eLM{-YvLb`;TxH-V73Fy$?*%JLIze~h)GY(AZ z72vfNthd^FyP^#Rd$DgY=3Bet?Ze08kN^Fj#tSdMiuXVjSXjXj=SA>S`Lh8J2&3w1 zuN5n(mTpYNl3Ze;3_wlC&imNzPdR$`&nC@t;orUR0d?_iB^jq_gGC$l^zQjYO~1XF zQlE#FL~VH%AnQo1oPR4;Cy%B)YndfDy8>8c3ls3F0)(wzI*g^(g>+9lmR;@J@4@DPZh9>SgObB!o^_Q=spOqq66iKeXjWc#HuV@=DTml8lajWnU-t5qlA^0 zfLSF05Lny*hUxN9tFad1omC3F3x)Q4KMM0pxEL+d&M=`8@DR8()r-2>g5NE6y7p23 z_*etU_)VQ|p3_y`5V3?>0M`22i!q2ByH1on9R=KCPEjrtou-lDk@(hkz8Bkf?M}38 zLq3!lb9A7nZvo6-M?rew+?kj-aX5|uth8X2QiSi8=4M%y&8lk3iB1X2BU~(F?bJ00 zAi8@eZq`ujW33p=SQKi3j^*LWx8H~#{^`Gu3EsDV|Ls@Dnkr>gJPCHW;@fek<0w<( zT9RmPGZ7edXB)5btRM0{a z+DhwGW9(HNtAxvL!dyJ2k}j8F3k$?5lwo}n5K4u)=8x~wWgu$kSeri`g@yCczU#qc z87Mzj7A6ueC(A&eg(qRVw3(-N+*0m39~|h9T>yOF``-5w@S(EMmG{mSRHCa?{4{k?&&;R$YaObj zSNZA6egQ5m2h3OI8NcAM_d5PoKCA4sET>MNid{RlV=ZiD0!RVomT)2X$Rl5iM<0I3 z)gf`{*opYNXP%G$_Uv=<%=0e-dd(5%tTQbR6kJ$Zn8$r3K7_!B9%opVF!X*+X1=x^)UIg6l&3m-GcEFJTBLHfGchNOEw|LJPC`E(-%q_1^l zeJE>OqO_>~>Y$V(J}W=xMG@YoZc0~$#^=oA z0j;kbE9eSXKF$le&C3VLqQ-0fZdz%5P|Y^4H7U@fz>O&I$+bi`dgB-Hd=~Cz&EF2H z8-?f>Fw4y>-2xQIeCfc#!K}$itnM^bC2!FO|lBPHs|wlD3an;@5ixbgAvG+}fw#nGP62r$DIV2p_-j+~R99fIY78ZJ zm6gCMKO6KJpL?n5%Cx%dsIMlj^LEO#~s)x)I9hy<~d#ygZO8NVV6;44!-M z16P%k`F-!%Z@xhOF(iHBBfzco6;?_vqKqb1O9gjV3E<+rB@~%O-Qx^I`{jX3gw)^I&6Y>_fub;SS)p+z$*9RUZtaM9kzjmp2>Jfm9Da`@z z;iXMioatQRRr1R|=eqvGqx$(&0-mc?sY7DTXbDvVkg5R+RhFjf3Vd9#>2k0)i7&j7lA1u_Umin=)NF z)+mF?IAK-BL>txBIQGi<_%D-(aMjlv11K1Wu#OoT!eV=P2rywVDP>gl6aXF4yaC>? z&mZjTrT4r2L6!^d9nYoxW7+nCH*qnITU^*Q3V<-aZ8RRd@7|c3yu`ThwK#hcV3Cg*qibkv zKd#bt#L~r6u{u8!om=+6Pn}o@z7o?fVI2jS*@B$eSXqc^+~1wVHKJgFW5@%yABeH> zu{17~4vtGz%sOT@)oEdgely8h%|KNrO0%5+6lH+G;eoz5O*>J^hRCFSVJV5();ew; zrKZ+f$%0FkOcbV_F|Lz7D%Mo;3(!fcyHL12`t`?RY;2ro>#o0S9oAR9eOn%YCfc7d z(PE8ufZI%Yx&V(YpMO2M!mJsSi5PKOOtxYPSZwd(clw}`(*+^v4< zHE-R3US;G?ofFvkYmcKgIpw`0=Ka31oWt@toBjw3+hQ|3r{cWGm zUzMEF&vCPgd=;Jd-g|F~cP*$WeH#I;db#WE$=}Xz1gCU?dH(zb7E&Mw1~h=Vtwi=v_OB}YCJ&8z&A=*ZQgOXmp|3Tb&*IjWAfYKOy zt=#+kbI&D3v9$P$zxa!I_St8X!g&R2MHSR@^W+C5vwZDlyA<$l1?*P&tkT*!pY@@Y z<#)dGoz!k^4}xO#Ja1-L!Z*_=rhxR6uFli7hH)`!U532>mCiS9x5`X^3;f!4opXBL zErXTL@vXyO{_>Z}wW{y*dbWmifvd7DxBVM^^ZmJKp1Bn%AkQg(1)aYA?Qf^OGCJ#$ z1ZCwnWw8Cba>f2q-d1MIqw<)RT)s>GlUD_Fo39w;Z6j8plbG1LoUrzdfy(aiHP=Bo9y=*tj)QodVKQdN_D< z&?PwNv9z}?oFMA{v7L$IsS_vSGK0V4le+tvj(#i?4n$WBu!>w4X1%x{nPVc1S|hnL zOB32Ap}+VP*lZ5DRj9yJspVgFPj!VE)->yNpW!7H;3y_)D6qars)2&mBPjdiY2!S( zH#Oil@807*naRPmI{&*o36<9hX4#r3vM+jX@(YG~@X-u6o<9#vSh zKtsb|H74E63D~3;!ks^apFtke}_gY#JG z5OjVW3z{klHf0Ont@>$FuzK?92D|o z&~oNJD?KkQZ$O)yoc;9rT#x2KplThEstD~X1%Mz*m)Z;M-S(f_JQb1drK}YIyUJ#p zsy}c0x=yY+mjEuTy)HwCZCY!fQ0?wQv5v(_YY$dKSZ^ppRBo=}4r_Y37H^(78E+pt z67zr-C1QZ}jolO7yY8W`QMzg;MqZ?4qN#KhG$aG{cw5G8gTnB~^|DmYC0DLqWVLU*JKDDp z<92e38u?I>quiI`Or zD6P+8QBzEcV*C9)d-fzN9~TShf=@+`a>10xQh7X;_g=HEa!U1d4YSxDQc}52xeBc; zTH>`Gn_!Kg4OmE&;l;FoX7hGwvNAsvE3@sf%;K9%r;o=m#(s`pwv0kUK$amv5XOA> z-gkc-edn#1Ar{w`J-5Z~gAYaL-aBHweIUBF?I-5jY;+9oWUNw%i*Nio<_|rGl_=0V zuDkDwyHLOjY-PStfpslVv6R)WXtDAq0MiTsCm@^hVXuHX)G1^!r@1Td`74#?ozm6LUsn%q+YfbHCM zCvo8RC2K>$mm*e20%Ps8_fCK=T@u#o*4U55=;pk6zgCzu<^jADE8_~lduvi;?*bs& zd)sZvec$EFmtqD!aGdX)zoG@m_SZref9cwE)buDYq%x zm~)%|{O5ljSEg`#svBbDpsrq_YU%@Fyfn5c_l?Be_wR^<4?UXtPThQZ?@KSe7(f2; zU&r&$KOaB(s~^+;i*eum4@57n3Tth+9IOFwQAdeIl=Xtlz;2zmU@Nom%+xZt=cbE7U*`X`!vc{yUtbVFXI4N1FX3*nr573E;sNSv zV^M&LSj;`$0C11R!w)_P7`RM56H^hu<1hd6uM%*fRo9Px^rO_)1U1(I`~<$&)>!aB zJ_oSo>%|hN1yIam=_shEC7<&c=Y-N7C4eQ*ndB$0$-@GuZY~5Cq)PoCvPHS#_(%X& zSz|0nc~Y?5=S}i+9tXM4mR;#$^G}lkO$szAaFZ!;O8{IqnTE~RH!1KNrGSGAw>$~S zg9OhxFcAQAu&nvF)D~C#z@op;TC!nT<;*B2PX0tGL3-=?hFUPvXXj;Tr%~OT1ZHik++u z--)tq3#-xxQDU~K#3HGFY;<*YlZ(`R{l}mHRi6|Yf<#4>PzHt9q6Ymk%I;cpE#qPc zD-Q#k_YQVPAIhdR2kjr@8#nb<^PhOw$pp$h;sfa(uDU9Sf)WRd6(IRe9-^YP3xFKORgK9aT0k<4(hZqX1yHEqMrpOm z>UTh{oTd6(Z{pvEvOua>1?(|4)C>U83;@wAuKwn+JX_-TDx1KOt;sUh%bY04@lDL* z$9%Q@Xq9@a=pNG5`Sn_^XOXN++d8mNFGI4<5m?;(PQ4#~|3|Y`+Y(k^b6SW2Sgy69 zcrFuTlQ>!B0o)Odc18CfRz&^Xap>}FymIJ5{MFz8EM9o&<+y~ka20okGjBf|%UIde z!7UW7GL3wIg+ZZYY%DB^=wr0t5>yiS(dC}tO&x49r<-*E=pisAXjIcW2T-8Cao%%U zY3X{)^H^@B%|4BD8-S|2w&rlpGI5|&~m+!7{Bt(1v+ zUwXA7QqJmstTSmuhs{16B_7oBtLwJM6AenqT1fgY7a*~OF!M#l_}r&RPfwsJMU<1!Z>d8`a}?3ENojN!^C z<2yRLqI0;)IE^@JSPHdaxmhM&m(^DUq|0M9i}%Z)Ka<=Qj*X9F#kGqVRJ-Ed2Ods& zTj%{MRxe|DH8ecR`-~wv5?i?Mj;}u*<6nC^W{SNrF{$-R5B(f%mAF<5>kDy-7+=*Z z7h~UD_r&;Z`(i6rYggA9DByzM*gDfSl0{ zf|;TyQB}1cCsO zJLm2j`h7m@+}*qY0RkWi5aDj%^tt!kbN1PL?X}bTu29(tf718tck*dNG?dT@I>H;XEYiJfaRoll$5&_LT_)K1-}i8mu+v=4Ju50K?(E)2B}b ze=Xq-$~G~{n;!D2?Q^r&_P$qsI8JPrH{X0S1oIOU69E#t2T|ym%c`*Sa!If{V3`a_{bP*)DA!`0U=|h7 z>VB-en#+v2D~l+#;3gFXg2Wo52gWV;G19}+y;%7T;nuKuK(4|0^ z0ymffmtSq(;For@?^2*kfy-0CMSu&EtW9&dyVOEe)7Zs?_vx42#kE?CE?ji4=VC_T zizekRg3VWEZG8`pd`DOXp|P z3y4(Cu}NOg9Tc${PL)_VB6M6Nj>jrm*&Ca^X^0J{0(1|k-I;y&^DRIDTZE=TXn~*s zjp`~^7d3*w*MP{%%aRuW75D5tOP?UE-*qVc*O58m{W9Xm$4jNDS;4 zj6m>J#)C{Ts29R3=^L@705F;WItsCL#V61e}14c9Cn0J+e}OkqTHX zs|NzRa7%~)wE?I>bf~n_V1pTm+QnJl&~FsT@<67vNz#TDQDDnc1PugP;k zi^2s;o8(a}>vKz_cA+efeL+`+g%wai@q$mVmZAlaOM6#z@p!DGLRaecKB7=tmxj`1 z0h%l;w5$xL{^1>1HtoRLcP))@UK|`t=fE&uIe9KU_ri_xt)t)CH&?=)V*f#6lSQMoE4K9{Rya)Ew)@e;mGrfHh5dAmlv?C>3D39`jiRKVCDr7Ry2-&qG+0 z4C0n@xJBPyT}vB7{b>OKx9xQ9{8U(SD3Gsm%o1Pd`#<GV4%)61{Cntu1|U!~7|@k;<-kEgwd0T&qi_Z@vGjqN#C~<(c!0Q&gCB z%IY*R&^G4N!uiu_gtgB7kA6CR_3Qs8J^s-B=`gMi2XUEb{HRWAOoib$Gv%?{`Ax8? z0v(!K($L1ScBLw=+64VKI0TdgsRWgBKdk|Xa9iO@b)j(W)(=pBZfZKc_VzoeJi0xd zU%)-sS}XPQY=$^ONC$A>I{M`o|B%kT`G?eiX0<&JMStksF^TozUicl201H9%zINyt zb1>x$MF(Ck&|&<+4UTo@2oJ4Z*FCtV!hmn9y7r)eTB>u5vDGfs_T{&v`V!u2C;P4zSJMBl4 zlatK*fYFhU)aHYyNcjWTWFW^;$5h7Ugv;3;K@h;w&qMRrqdT&EnLEG@D2c1-?gE#0d?ND|6o{V zE@4r5?#$`niSy?#P@i4^=pE_7`|nM=Y4@p_S>k-H}U3W`Pq5J{k{Fle7mVj0V&`dAt35F>Sxy> z&JlvF&p!KXSlP;xT4`%(`{08Q252fj?c3y$fMo%ec|ix3WRC71aFGKmAiIKorWj zkWsTNFHBs-xIpQqODMo1E`UJy3~X5X*?{iHI;&hANaOgAIfI7#d9=Z`&eBz(=a-1j z@XGo!_u__z`?sUf`yfJU4|MR;dKOUUy|k}1|NNbNy6GlS08*=gtL0X85Fl%ez`EP| zQ~!2i9}N;*7pea6Jgz^vXLuX2SsuMN?ZBncI$-Cmv5mA82-7G}%Z&_zj`|9~mhN+= zi4!tiXxR&!ghnw^om->aH>rK44i#2TWjkw~C%9E17D~AvZEgUF0b*qgtg%^ZuA~~m z<$+y8X=tD?1d%~2yCazdD5BL5F8LH%)qAyq02Ek5z>3_r$9{bk`dXGq`P}|$qxc%N z^(~`uc}i>+wGL{pGsHIFdQxLZpATUu_dtYfi)&?SVH z){C1jt=>&9@ReR@MM$=TW!!2Hz7?M@DY^Ig%q5r2Bd2zj(S8cnrOkQ3I&Uc8)&qV0suJYi#>Y-c?ESGZ)grG*(4#ypCnK;e={wf%V-RXkyRe z(ycZ$oc12QKi#vqoTliX=a0XZj=%mYN>1m~BCbSxh9?4qTt54Ds?WV0fae%7uC(B~ z@8L(%4tTU5OR_3%|AO?emF*C1@g4%-oD0#6?N`O;C|J=go0JV~9bkYnhH#mFU z#;tA^pxnsLz3Ee5{7L{|Z@m0``qj^W3f~W;gP(pf?KtuvG4oIW!&*D%-^&=RAo;@C zQ|YZY-yl}sDAs_7!wqNu?t7sj7XCbA3_1B$YaHJgZ0ftC+fp9de3>!R*nGpaI&KQ# z89*!DS%asgChJ6uiNmrBRsmEr2b7}t>zZ899FilD18pgi}4Zm5sW#% ze(uHe((7-gCqDU5di)a)rHP5jbn^7M^xNM(6JytlFTau=dHA99M^8VU)){mD+kg9; zi0LKRrPYSYk&}~?u~+o70EskLFfHG8f+e}{=XTnn(Ov#QdPp-t0%Cawm9Tz%k z+qigfq2s;g;{rKrO}@`7@4BC2ao67Hv9mzi8Q~L~zY&B?H3TC&aVK&B*CeOVxNJbj zJ~rTI5K6v;*8FL%ttjmzjkA$eBliF?1V(ulUn{W}Z|}n|rYre$(@my;!X>S@5ODU5 zBZ%BRoCfzGgeLAsnKm1kUPv`$WVPKp)6hc?rs3_x(?MWy>B9f!mKp(wvJv?OVQLEj zM#OYjBIr4r?e*z7gl`CFkf7DEBq^+n3XrCdz}?)^e*AAkP=zq5gvC|>T(}Jq(Covl z&%h|IomMKT7mJp@!M-%O8$sqUn>@grt=S8T!qja_Qx|Zs6+#@e&!8HSra1MZL$6zImBNQFPb=lB? zBdLn!{iXm=A42H+=in7*5HUvLsu;h`?jlU?MG*3IN0z|E$tsEN5Dn0O+Jl0m1(+0xJDgeti+zsCUsn4Y^e)CV#kp~`1gXH(> z^S@8O{@IVyJTZJ;eEk?@EnLH`aeazQ#mlMR& zVoPvq4J+k!)@!R+&#W*`dEIfchxyO@tK+-UgHJq3ysf2l3X7Pxv4mRr-an-WR+{OP z6~@|OTp#kR>u9~;HE918+TlF+YQ?oNax@Jdc$`>o_hPvPC>y**n+JH@Nf1X$=3ai+ z`fUTHgk?bQS*)u2s~bh!E$(PwFW@(UXvHK z63J_J*Y>~v{qJL~uW(XOX<}j`TumuJmk(`E(~VlMNH6nNfUi(rLA}CM_ZOGCwd|x) z=jU8D0Y%HK(BHjH7PQ8_yrY;eZP&}Bj>{P=PePNYn7Ptq{jQh0QGxl9-0&?N`AypWs7?VwFj0G$}(~-l6(vkhU(`O!eAWfY+ zn|6-$rRBx>^bP>{X^saE>`LE$^6|9o&_sIs%@gUq$;0V|mtVupT0gE~}s=6XPhzpZLsXt8;-{AsU*yj-19Y;v1 zg_p6qUfNtw_i*1XHmxND8+Envp+K=6HsiJsLcxri`EI)56ey_7CKX9T1#6xvU`K5S zRu;IQ>e;qEHL+|c_s*uC88mZu?oU03A4!S0Bt2{>Z*@d?^)PWh#)*Nmb0qaG<8lb?+g@CR z4eZ&Lh5$D!2PTQg{ZuWGJfQZnCuzPNCM{yH4-Pw*xHE(EpH@YU4P zS_tMhFewu#=orjyP(g0(Y~>Y!&W6Hv`r3kYTCAtDSZ!3X)@TmwBAz3_c?tJ$T$uqh zKLb!Wz21{n)Zhp7s*XTLVkMOZ0IabFlIMa6ohz6}ia1%E{muc>1@FKdoa4Lqn}XjF zqAHx_fT_5|eAWIg*rhwH0KUA|2EUA-B>)yyDZ%`a8P7*2i1G-I=~A!)5M~@Nfi)2H zaCN9v*9IU~edYvU*IX1m0dQ4_wbcut)!Ka@0Q`Bzq5`a=LfrH5Za?fo*3Rli8}eC~ zcU~JD9LCk!AuLkH(9FLtz%9qyb*&be1L^>fT4gobLLMF|5*Z1EwfL=NTk+lXn81huk;f4=-|U?@SUmDKh50WoB&`_pFbO*a?=x5UCp6#h;2yipnylD4aty|(ugIOv$onbd^2y6jptx&fmE-V5l zEdsg=dQpk3BDYWy=o#Ccjy&-djApi{SAO%0bo`~?r}^*x&vXW$;Pbe&`|Kwl!R_2= z@bt{$N_zX9v$(fA6P9$Pp`O&wdO%RPNaUZHXX`C|(2|Rv0@wgBt5cpeta}!!b-*pg zcAgP@TMHo0xJ$&;rM4lRpV7 z5#5z3AQ!|?&@KQb*d<`0!2CuE9dq7VZCO68SOO3Ptg;-wUp^IZQ|ZohsY0E3D3CRF zk;-@icLKoKy`j%|Pkxu*-!IwMOvan~(wDxJPMkOq`Mv~we*EJfhhW!zk$|&(@`|ZF zW(qVV#=X+OXsV1gQZMb-gFEB$@ItCAETsy(Qkq`{2y>jJ?HsnTA`DlBw6hjo8w*%( z^n{7jHK4pKeFSBtqjb`O zOBc5Cm^8E>*lz{Cw61ioEuYBqf?O)1dN?Aa`= z`R<{BW20lOJmc6YaH@<)-m|X@q6%_39t!-cFkv6hyeL1~zhnGz0_&zO1-caIQs54t zz{k78yaNc>twNUqA2$W^2GB)HPA*nlQ0L8xn_d^;YBOr8ZgNv&(oDV6_i|jkjz8DB z`Mi!SZ>?LEOrRB+_U{Q{ViVzzLFyZ5arXjl?Hb*dM%nD#%i?f}&By8WmGtYm3uy_L zLQ||4UuL6PBgWG>F(3N45BWu;pd0O^v}SV_ZFn?{mEb79?xveS0q7h67Z!QFql2lo zb9<`o-Je?9b|bLBf@ZCjHu|U1O5b=|7~Y@yM|Ou_^N*k3WspMXQ^B20-{2CKAy}Ou zxUQl#+(KZnfzYKoK+x(1h1_>1LpcU2HS$!#7gVJW>sI<<9|EKP?SNam5i&0lru-_0kxJ`16(OraCeFhI$7PBH+>pnw`NC@WdR)^jexS zULMy=Sk{#LiDOWe8**xwGfw{L{O&#ZdvW$}JS|gQl-l2mA3J{GLi<`VroruDm7)W@ zOOjw3?-Sgr4DIA2Z$lU>cqZ6YH@4QP=dpGM_~QKnXc04vcwvHE45(oZu|9nq01RtW zVtQ4u2Gbp4B(+emBFmA>*${X zj}Ww`6(``vBD7qX!=i5!L3#;3I`mKiZ^?z^+)4xcj=*=UM*v`sUsz5{P24FC;|lV? zgJ~3NLd5B5Wy%<87ec_^WPMWReS_n~LgPJCXnUVVKz?8hMW<0*Rw7g{_`~nN z5O6oy5rC-eeCd?9h%&`i!hBl3CGx)TG3)%zsrK98f($abhFzB6h21~AK zVjJ}{hmHa4?b^PLwb(|Q#d`19o3E$SXU>HS)_z($9 z+8X66*Mn~aHjKgLIKDdAO52FP)~adqh4KX~R$&eRKe>qXS@5WpjX;uu^+Lg-c%OjK zkAC!{uoh8}Y5b|1mGXW=s{jEt_Z5O%3gi{kXMoE-BZ%TTKVupFE+@7-kO-02(V0x2I=HJM@6O9>{G;inoEE8cYhbcZ|kk#TToOXw=@%gv28M- zr9fPPc|LMG<@U>Tz9J3p@E@#y=1+ktKg;*_1!*dX;J(^DcD9Zai1IlP`-c5l5W;=B zZU=RDC=l%P?%Vw=@Bi+1zYA*mi~xqe>ALjMM;{G-wr%eA_PE2@?R~4~d?0TLjAlzM z&t8{@s#N7Yie{79D=6O!M&;U?Wa=<_e52MNmUk*Wj2Ww-4NY#6fgnJJT{Y~Y*N+EJpbCO>FwV? zlP+-2+sN*=9omx)e)6%j7Y)BrgcVRP{PRnzG&7&lFMpdh|L`)KRV+eulO%m_djj6t z6;Pg_!fY9Ut43^vJ~o=Qy@%5J=q}o(l9nqgX#vgo)=DcKTR?E#N5FUl7%=$9Rmh*RCCG0GH9mo=Rne4b@%yQ)w4&$`F`F?~~XFrL)Qdr5=5vG>s z(cG4#oegs>B=&wDENeliyCVc;72hX;lb7NB6=>tJhE-XE@+ioS%HO`QR>e)Iu0oq=;;%LUG|=!z?vCYKBb`}5%a-;$JHHW@aP_toTnsDz*=pl9lf=nC z?GzuaPyW65t>X@E?D!TRJHGqd*4M2MIrsNHThF`(kU3ZZAmBxa0`R3fLfsDC}8P{phu|RKs#6 zk~Brb#3l&PnGaj_^#;GoJH>x5#Q%6!dT=Ok+}OZg98=| z*LcmbgU}lbqBAFPeK{XsbcwiKeIw)X?vpS5A#F^ZO3eozOuMjbZPxE44iuxDeVX^( zaw&==EsEl8P{t+3r5ON)DZux$fXa@OYk*#zqb!j0j%uc5ZShcY@0Eit2&=?CIj+bAFFt9=}4m=_GbalCb zd+R0E7>twv*@YWL0WM>P(VPG#Jy>@kh{VlgU)0Yx_%FEZJ#Uh~I{V<{9ODNt5 zZVJGv451Ym2bSA1P!Icv9u(=)8dh4ku5B&NVW~fZl`L)?msfFZh(`#1mxrutKZ-kL z+$JW*lSTF^KmGZ?q~HJH`H0!}>Z`BDIn!?$g`GFvcq8boD@XT!T7LZMSHDXC`+xuM zutJhf0x4PxNq;SsYzu|y8B~#WnSMF%JNcY>ME(?z5>${D@~QN)?+HTbK2%z|_x8wE zR-Lp8o`~@sU=*5qn5TJZp(*VJ%Kq)Y{kK6<@AqATj#`Pydmig{(rCGP$T?%w5aCcCk3vk^X?cA;9T}A;H z(k^^mTzhsQ> zcz@0-pK~6!&6#?YwjmV4!lQx zD=zcWJL!@Hgz!Oo1OoyBja&vR3Ir(Jc2}mNjcIFz zNC=iI2!DF%v$e57+8SV*_QtUX@iowf9wG+KHZ-4i>`Y~Z%UTIULo*hFc9I7|Ei|q} zOIraYu{SEvUhpiKDVXBg32pASi!M(qSo+9=6)b%OxG>>J>sY+ZueCyGdvazqot<4x zs{l+PnD@Dx)S{L%-0!t5Ce#QQ*iuuyj-XC}E5xz7RJtWhPurA{M#1>)?*f%rA+;LD zPysx!eJ|}8R`vsSZfT%fstqje=9lPmum#gb0E2VHd2>wPfQE~VC+8VYX0XUx;NE3~ zqICtN(lK1x2`=2M*1cXPf|Gb$oxs7CbJju=QiSn3EE$`GZ>XsT`7i*+~3O~gdhDv=+rSl7;Vul$588bCmobN~W8X8&IY z+<{#*V|br?q{t*^wQuOUZ6-pxNG{G zk@C9U_iBxz&|iUTzMji}X<00zdj_pov`W#foBI#l6$+%7k5(~)3D*5uQl^h!jP;+L zosIl`R-vzoeOk--Zb2dM?<}WE3c408F`ucr5-wfw(m=!0{_JlkUrD!xG*XX^NIsj4 z-_14l1^rlDsZa#(xp4$JNG;-TZOqT6m2(%uU9uLxHTEL{ZY5k1mQjp}u{W$a=F_WK!)djqBBS)Y zGA?D%wqV_R`HZk!Bw9nt)?&GifK^WqO-;rsJjWxzoPOvs!HlC}-D% zf=z6B^cb%96I!w)~49(w4Z=+A;#rrZa7zaW=wV0&De zU)_M#wGygcAc2k!ET?%w5aHmtC3vk`(E!?f& zT}y$y@O2U7#?zppZYJFX``v|*u0hn;bAzLWm%qCZcQNFq# z<&|`T*a*)NU*H7s5_ay~1)#`g{=WOup@RofKbza-v**(9r_ZKSOH*kQjp2I{cnGwIlupj2fhD!vv+(f)yjFg>B*m5YUcTh6_kLB#XLdV=YiWKLZg6%G=VAmm zI)mE*NpQ7)v79e~k?h7l?RAW7|@xjsTiA zPkmTU5uYXDPHnRn!Jx#A_Tr4dNg;j@mYZb-SxYOag4JIM&`j5dj&b}cX#3u#y6lzC zCfH;=)#XtIH;Gkvut_Yx2EwhS)n+xX#8(*?}lzJIT`>G z(Kp|1+4rmME%jRlyu#(+zDLvAnHST_TfYi0v4pG59)z}=fW!6q)3`8P#+qn0%HLR? zN$cld2W&o!#n<)#76N>{$+dHMbXfdoQqd23vUMG2ulQBqq`~??ddaTF?rWk%u>sIk zaU5yiXJLx+yich*e=;+Y>jS}Pt-oDowd%_NjH_5BKa$4!achQa!shC1s!tySZCOb> z4;(^>-%4-3{%RU#Ec>%>e_2hXyUsW(}RwJ)lEQ@4aZOVfaAk@z!w2<^#X?U)AqxR5lzY!Z}3mi zq+2hsZ7sWN>zHr&#dZ3>{_DS{AN=44AxPKto**csCTY&&htuV1^@0l1Z%V;)9v9aue=h#!F~7L7nTg! z!mV>J;@(EO34pBvNDSdBbci{*#Mo7$eDd8U^F}geqF|H=7LA0HzyPdD0IWS&{Fg+s zNw#nRT<{{53FU`yU&x%^3?K~xU`F256Jb#s+*6Y!%x zzm(QymeTqx@xS^}w&J!j>xD8g1A9i@d%(}sql`kqII*~_tMs@Wz-2kL?E0_&^}mMl zqx(X6$bI1C{kQW^n2Lde6<`MV1!wIN+xyHRqX zxZcCFfmK*Nnx%sq$>ySC(6Ra*Sp+S8iT+A(^?f0v*r_%9tT;m{E zsUUP$Mq=y?-hg|f;!yu@2w`oF_B7o_)Qj@oQhy*`xO^g>LY4R%Rd~5)a44;pYH0?! z!3lt^6SFI63V>mqSZh6}=TmK&_CTW+#=X9(wA(9Mt!TQU@!FrSRe00+QUNYq$IY!E zfI~<&M0}}T^u3{8+>8>#sYGm*5*7m?Y|HQL%-}Bgyk!VO{iCfB^i%|ru#~FM)=A4P z!rtK@Fl{1W+C+Ol5yN7$gq4r|-K2mTfXmn{JqSTd16Xeod!qzkR>txww6#0w>tmhY zBa#!@3h>|yoWwi1<q6L@ExDot*^zF13M`^MK7aIY%XKKuJ@%P(_!PId!4AB}QUR8;nD1tiN=dx_|}O4E<~tkYUl7c5Ov~=>L}~K~EXQEyjs; ztmaCCyKqem6#=OF_Z&_A`yN8kWiOUGBfOLAfDAFFI0r;2E|;Nh9kIk*o(_I4hLZx6 zF^-yU?J8KweGmxB!mAOvh#EbhA z-NJJyrSM!2^GIc773**TC#s>Nsv1TyVQscd_ll-o?D{b5UiU zUVGw+C(PoF-W-emK*iIAqgv7Syt*Hs{` zGYDy4tFNSG1cpNhx;@XbX+6m%cbMsaX16Q519O?RW8aHKLJK z&_-3j+{zH{UHXU8QmdTKFE@yLw1&GQHw$Q8mvEPJVHrUN0uBUOF!%M*jTePG8ibjJ z>>QzrIq-h>w-q+L5rq6Yat+}L0$BS;~TdA%f*Cs-yI5r_RfJYB;XnN3kP8^$600?+sQ_usTD-jc?rHih18%K-{ zH1G{HUmh4tEyk`MwU!YemFSO!SQ;Y5{k-gYNbJ2bAvN~l`q@|by)6*59RXr`w@;?NJr5N3 zDJXnT;+?kFRth4-H|e1@h!!+GJ%9_eldh=>0MzHW&D;6iBjPG?A=(m)xJ=WntZ&B; zf&mbsGO{-f-TPEpzwlQy|VHxva0AQ`v`Ls;@t@ZQI(iT`m_7R_I{tPa-W>O8> zSI724KY2W>irkKbxO|zVP4Ebyk_;hBWCeuy#syg9%1I_8Ngto{`QlIUTmc4n5kQr7 zMHAO)>$o7Cf8}Rs`JETr&rk;1U=vrJD_D&;7;_k1(o$PECe`K1;PdwT%<*O>Yw4>! zGvXB%DUi%DkN;sDX%XpeTb5i4Sj8*>bgkodP=G54VB|n3#K*Tgn6TC`oA@&cQmYy0DtcbA=+{W>|8{Lox*X8ypQ!)6U+vfkjqzgmnb~ zR`48ik%||BX>n$4C|KR1jCGXb)~B#A6X0UaXIUD!Q*NSw)daMTSY23qwXihrXKnKk z)*JJI&p>2_QSibbSap;WUWnPy{UjM7V`m1=)pZ@8ehC4&^Fx{zizZ@Oz#%p=3 zlMe;+wc2t{kmpQ-(<(Y-S&Ja3>BEf6kwN!QmjYc1bSZF~QJ@QO-DVBeEpC?rAA|xf zeBG>g_HaS&0!fX}iHV8WAi8iCuo8rEL*pXJO^jMW0s;Q6Hjp5g$!j@Z7xVt^BHhK5 zn;f5WBc-OB)?nTv$fJ7;L9V>f%w_r@^}6ZLxREIK60tE+0O6w3jiL3nE;&gbwfLl^ zzgc%Th+5CR!TA()UZoAzvHr4c6scT5uv)3(W{1slKZ4vT+}g~dJ-p2G2if!rY8gNs zu`ch*Zz|4yz2wrxH*~*kQJ|oc!VzdmJCy)EHW4hW1A;8l9tp6@OF?R|xs7j+j@Kr$MFB81B=0R@H3^eH~H&wlqa;1bui z`mxs(cD6P6y)HNr7B}P(!r-89yzPS#%sdfBw~WK#ZCU^TKmbWZK~(*hJLxL(T z&SVtA#4?Hlm7!h5y9CfKO6_t+864x~8|p7Q-EnV#R`7-;1`|b$Zuv;@xRml2>k|L{ zW$S~#-tH+Z=jc1-fw9zwTRaFGZBxeeRtRj%Y&Qg$72^kt)PG>K#AO zrs>Bcq`#4EAp1BD6{$EoJV)|t{@lKFrIQw4CB}kqS6VPvu_iFqAlC(fTP4;Bsg_#C zVcdkzR{*n^*Yevd#Nz5h`Ju{M#BuR~M;=WBSQt6BL|?no%Wv>?%NN~@4~}&n&S6@= z8N;g4KCfa0xyjtDo5B^2)eXQc=W0NrCg+^b6-jEgy|^Xp!<{er`x@th9Dgh3`OXIE z=;s9qC{tw48J>=Lf$^ul*lBg)OUkLfFdbubPcLp!0lXTEXNjG3Fs&ZqV4$!rE0lYU zbG^p+LB?e*dO0_l&t0p#KGeEHw`kx0{`X^jtzwz!$dMx<)SQ@@*itSl%6N1C#$4o_ z`T-7w9xi1my5#;h7 z*XMaZbL!M-_DI`s5zHP2>+dq-R;33I7AQ{i!e^BdRybH-)kaZ}Vz1L!T0_YKE5b$G z1;QWi0@wv#%Vs6!b^EVtKxZ1dGi9;w7G+`u0v~E!#=Tr)h6^td%~jlGF9CFse;viE z+DO}7r8h?6KISI-a}`Un-6Olwg8)yT|NQ5Je+0NxS~R&g(-oey5ERtXO{F_s&YM(T z6yVa;*{44Bsi2Gd#k|jv7d@oCG_~#hT`)|(%xx2y-9dlkH~XT>p~lHl8B}mV+6i7| zI%qZc8ZpqMjex0ilP=QJ{w(ky7@haWnTO?L?~!k{lruk*{OD)%^RWG-zh~2(O7Ey# z_sy~1cIRllO|gmP9ycPH78}sL0{FN8;K4KsjX%kzahc7`(#&i+ zbK+$B=`Vhso_p!VG>wpD1EFj$0+lfYCub1MmdWc|2w)#a!`RqdN@JjK2(>!Ps90x% z-+X@-6?B)iofNwCGqehN6+)%Wwh&9+6-4BJ&^iQd^0z<j-$l}#e&?7 zBuzg=qOTR!Sd=$9+7R&!NXcguiR09IsCt_@=yQN(-d-F`Tg zung)!_-Na0%%Vte^4S2o1i^ZYmxG|PJTQ(05iULZMz3x3R7Hkfr#yE4#Xf-X~^I)2N^ZB%V?qu|%9lH=*f9b2~!G|ABd$*0H$pd@S z#L=SwT=iHxU^jY|lH8b|rH4~Z3zdI(y@$B`j2pduSlE0it+hUvuwhIq#N=9Dr(QLcoKSoLeC(w?O$~(O zuG4?=lb^(q<4Nfm;4`23On6#wO|7z6PQ^Tszug(<&N@kN*VXPd1P|O}2u@|oErq?= zqDBzM`}II!%wcIIh~-{JK*D_7d$?DzUrEPVjy)1n9yWdN5yu*2T7yV|> z&K+sjwow42zO;9+oVMX!uzx2CX|#6HB1`fOjIXIz2~?;J^^ zySJsGo!e7sJ3uQSS;A#DC1Tpb8Far1EW|w!HN3j+yax4K*SBCMP!CtH~#C(T~ zp3MWn3|XGnw*>rewMbm zz3vn`-){A=&zL&LsgJr2z9TEidRA5=Unt9wH?*S6hw%*MJ3+7;S*DM=j<;fdH=}KD zX1%jqO8&5J@`&TOV@Q`*Ze~k#-*uxY&;__|G=;nQ-}Mx55^+*7`PoUNb0X=SKs&GB z2*PCzAVDq{N%^eyor`uSI z)iiPe@1oylT!6U=RqMzFzlRo2d6K=+bjans=&WQVwu0|obzAAul_JMc<{pntEH2h4 zzaXF+JvS_Flyj1fYTsHPwJ=A9N1!7#LrZ!Ly1AiLTXApcD4^6f z0E=D2eOT!90wQbKRlLkc-#@*3hhmd4G<6S-)Y9(WW*TYYE@yc*txr#-b%4{2MO@eD zt|^!2-ACX56?fRLA@roLX~ED~A&%g}QtAb$>K`ID6Q4JA?*sTqP&|Sm&<wx#Y!{d@V|nFEVN| zuC=s=#6mSdkIbXF$eqMg@N64srL{T-tpITWyP8^PX_4hPR|VWE<2JG%&}wiyUw4EO zLK9k+a9wC@EoWdst&;K9n%giYs)e;t8MkERKH{qZ%7jqcmdsl8}aI0O1P_6+qILRRs|&q1?2)-DoymEK+(?_QDdyggOTx{Hd{lffe?LV|G_jh zI-cgr%jjRmNMbwq^mhD*d<)2J9E$ssnn3B`eSJ|C&-^iP>>$O!&MT1%plc zykk_1P2Li}!IzPLaV|;=ud_CjcWXQEftMeRdm>lHkj5fb7K|?|C!b06w@(AkPsLAb zGZSeQWs4Oo&z3guj({cC8m@8YmasNut|_q&bgg~<{JC`O*jwR>P$9SqX9~A<`7Q9E zdpLmwEs#7q*P!vDJLHf1Cwbq)B(SAt2*CvFtrde7GXhn*>GF5?H0~?3bTN6q`wr>l zzDBUY{fGAnG`LsMV})+pO}dLSE}dY-DsBMltohxelmJ{CjAQG|eQCL$en(rSg_%@d zoX4sQzC>}Uf6r*@=W|#fw)rv2PVrSlYcd(l&{e0F;j`1kg#@S_Txg{J?Q3a{xqJb> z9v!Tu?bXdxou5maDBaZAQ^dN&PQjdC2Kee7gzuys{L8R5>%z7rr6 zq>yLjKS5YsKYI3A^O4Txp(hmg;wqd9gt>?Ixo*0-6p;V(;hVGE<5D?KzW#ot%VV4O z$XmI;>G{4}wVvH_bt%vVxVk*hrN9lMK%VrR z7@a)wLdHdhNB%ueB2G3gWNu{goxaD3%FUk(^MCo5e~AURiy}20fAgE)r2Fr`KNd@t z*|K`SpMAzW{Om+&*>gQ|x&5B6TW?*c{HOo)pVC`z6&v+q$Bw1H`J2CqO_2V^-9Wif z*X@ION(0MyX}&rC8*)aNq6RQ8-O8TnJ%A&vrL>|dv2iRRZK-p#2rNBw?tFR!OOO{{ zdHUS zr~8I?rx)?*|1x^K$Jsz1XXETC@CkR1YN^@UWP#XZ~Hxm4#Yh|^ft^`+ndx#o=Xi;CCX(SIZU z7WEc{YHI1kv5w%Vv;ZvBKbJQ8YN-KO)mp|ntHQWAb&Adca1wn}nsKN(jXXXZH&l#Nee?Khmp0A;E}+t3j2PkZ2> zQ^Sl2bCvW?Z#kW&TsEr~WLhtHP|)jr{YP_uytmj4U6f(_dU1`iMe&gAF-~cL)mS)# zz_)NIsIWOK0KGs$zq+bnc@A*%bm~9ITy^wI#j{)G?S9yzfc>G(iqf~X^Jsuw^?8JNQ^yeYKbzKQ z7XbtTFoCcNprq{^Z65JzwsPx!Xj4GURRhCpwN+sp=w*t(|+d0A(4cAUHz;7;6M* z-hb%RSla9)*3xd`&;2&7op~{>&z(=Jvr}nlaXBsV%v!lWt&`Wu)5p_qU;1r&`MGCU zSH2hmafRBtp8C#rz7rNk3NckSbG7BHR~ur1rNV#rDgoF z=bn2mKmutXxMKVntr%Q)xwmmYApoEt*hArP1_h*7;)(9A=@RyT&p3eXzny1eS zPAbMkUrR${#Mv3;;C+p}7HM~0>5}(*(!^waZF zdJ1&;%=^9f=2GkSd|Pf~OYdjfG`EG{bINmw?RKSh&i8)YXZgtSLWKks&6USF-{qKX zjzu|?NS+rmKYJFq7YNIBmQSsBCp|vyI(FaRr9dYIx&T)vHM*a>6!-`!kS9eqS#F@R z#)JzOClV(dlM{s#kKmDq6UL32EPbaFl^YfpMV8C*IpMh|($$CBVoqpkjJnX)QY$ao zyl%35-hZ`ZUEEB$IdbFVck{|xNN$*{yNCB!eT9iIsfCs@)(y&Rw90x3 zmnG*Aw(dk=IEcW-6asF_B>>k)e#YrKqd=BxD+-6X=iQ}PJktI1K`9_1ua%e`_u0j3 z3LyzXz6(%m-&lV-w5>lK1mxP?UqT21yV+9oCsXk^KECgtC=P%6DvdM*3|d+Tu$euZ z>eFY5X9Exe2-89k7%^YS`&#pT-XuZ}J(>m?4F~6Le zON+!zBL2yRGbly_exX$#;|y>lfvH(fbun-E8={}5ftR6C*JAi zjxnkb>QVqD@s2+np5^U=o`o>R>#a3t4wx^16y**cE$)r)jAunRvQ8X+2fQNiNa`I? z1786zb7j<*-{XDqIhGKN&odX^NlWKXK+ofC_jhq4e*ly1l$%<&P)6Ucz&iS$<)jQb zaZRDNRv1mJzy!B8X5J1kO;Dx}ORiqsB2wRrp3BeQ&F7#e1b{Zi$`?2?0vzJz=yOHCEBe)YOK>Bv zL{H~WtZU$(Iv>_q04;N@Yyv_M6LSeAg(ZNlnPtGyUMyJ||5kNT2oP2%a(oEhk#MAN zg$k&>cIKr3xs017?`nA{U>oC{1fz_b#P_SOOb75)9o`k-R|%j!Ky%h|jtde0k9&K! z9V%QF;xbjmh~@KV((K@?SQGcB=DGefMcl>pv&Yl<*Pctq-*_#(!x~dp$*zgDv=M|* zAXKV%*P5ekpBjxdjY@~*L86I3+mw(tV`qq&)>^j3X6 zz54Pi=?||TPrrHTjRa>9ua&iUe_wiFa$gz;Kwcw%m5ds+O)plLx)q%|Ka-AMm`lIL za_e7TKbhV-JH=kAk#?M#P7`mRPSbPqX?9^T-GA>rDA54o5`*&`EOieq33ra~NX`B1 z!PXEg9ypX%N4BSz&f~6kxs~=D=}%)QZ#XH+HznTZ_-h@l?<|%;UKd0Wn8_YEuEaCa zP7qbPOBeaf&w^UEgGUAg-O~!xC~(jF+AHOIr(Czc$ve`>BmkkcmGqUDq=`J{HT$Ww zl8@zS+r&OBpScfL$y1=h-@M1XJ=+I7I%%4JyO#a;okHtdr5?70?IP{vf5#U4g>B+E zBroLl$$c!#PA;v3*UiiE#(ZpJWgp5*9D54O(bdRP-Z8$Q09U?O{u2Dut*T?5@)MuW za;8h)*ZqEF3gmv4&)#XJo4{8XIb;}-s3nVzsXC={QRER5sq1cT-M3DT7P-XLtb~zl@2CBS@~3c z%kR$b?Vh_7xK$|71-NdNmgtt_j-!B+fD?dPZCXj?1&f=hiHUauLc8&D1K}dYz_l)J zKI+A5o`lTX3E9P$WpDy_VeaIWK_?r+vi{>g{$osDPJB*yCMV0BS6sNtAMbTibYtWK zz=gaUA^nT%n!(sy`p(zCyBl|1uee~FoSY2WNe7?L6YEu8cYQxo7b;W4!I_##>BqlJ z>D6Ow3@fS0MpSozrxAX>f@`IdoM#ZeEugu()WByyi`pidl-qGDGl{FKZ3r{4DG2aM zdz=?b1bFXRNf?H(F&#|zynQb9{{0V93!Z4U7eI<*BT>KR0`X*6j7;?5vayA=0!6E_ zIem$DYpu1wu}pbRQH~J=s|R_fE(>+MrFT2uSw=|DM-Fplp~a!N%4^+p^C$pI(NBuQ z;NktakQyICgMPd}9R}PwG(M2_pmD#gXCn=65{09Mke#6AMY@*OYQKP%HReNU8D5+@ zn;K_Mq>Zy!n-C+aL3}7JgDgv%%WfV4Zk0D#@gM*_0<^k;TdO)k(K7vP18wJZ+n5PTD!1-_11ZU*OMngU4iq;_&$VDyHXE=E}$7Cuz)zmZJ|Ch3b80-M|Rg; zln?xXa{*)7X1EFjP{nm%jHe2L87GY+f-fg70e*Q;+wGTxjo4Sj71XN1SXOozUD@%6 zgK?~+Wfh0q3w^`73PJtGCPGJCKs|P-KRvLU@lP3Eo5MpeUg||NaXNkf*`KG`W5-hO z005LE!va?8A@hs(g+#wS0$qowj7GL>6nt$$pLDPBoVHi4Zqn+83*kBj6 z$yRQ6?FY!$o>PqLiB&LeZ3hM_fLjO}aAmd)kZT8X%m^023b8xM7vzL;t<5T9$bt08 z{%@sW77e?1?m#GyMF z{8p}R6aZJYRL))ZgBHF`G{=Vuyck4eoN$aQ18DaL5PKxX58a{4tBu98Y3a3p4j_Hu z#eYhb6TeNpJB|<+$#HEkEL64p>?t#D?PYBb(A&40SUrFs%V*z8X8_FS*JsiTOS5Si z7k4yk+Dw-=6~F0cv$yv6$ntE zP|p3r4}S22a7(Cw*Lc2K9%)76zD6+2J(tgF%^*$OJGhTfk7H;x6^ zRl~Zxj~JZQ!Qu2KiZ!n+12R2ue|qGeds20RF@S&R@Sb$Kxt9L=@BiO)finJ|e>s@G zvLF6*0Hyww-dg0{SS=J7fBMs(#y;*_-=hCRSLtx++QmJq$-1~FG^y$T>tFvm`MmUX zKj=O(gInIC^~lptKOKA6ykERDZ|}R4k~}6~xp((0|K&Zb7MB9kTDxi4B@IpXVPm`r znCgPie(hd710#YH(k&l8<9jac+jlx`t@o{#YzGg=3I+bpKKpF?+0T9!{lK;tZ1M;z zPsS4a#23Esg=llz%V$lw?Ubq5&wl*lA4eQEzfUsm+mGZ6ud z-PhlF6v&gM3mq4>`i9r-U)BUsYs&>vUYNMC%9GTMriPQAlctMm&n~3YK2eiHO*1EM zwH=)dvsOyyMC?S_Imup2d2`)-w{_1Gsf&8GNRAW3N=;0GHj{MIvdnuegBt}8>3Y5I zzFhfY@jzadM;BOiG%;7unw)v_SXv^`auebADng_=0Iie!_Hq-807NbhmdZZW&(UhC z)>BEl5ZWE>A=tD63_z|10`F-BdM;SVUu&)k=T+)+etrc&O3N@7R4i~@vUt`4poe$T zAOUJseTMstp|uAg?=0ta^1~oJ;%ph8tAd~Y3eP@J9Z1`_2Qf?lVaDsy%FD78%V}QH zP1i>O8~M`YwaZ<<^u9~J>)NspAY~NyQM-w`wI3_4-3TVP_0&^8@i@w8f0wb?>rt?O zJ&Al_9Do}D;MHY>_kc6+oWixz6mIUYP9jc|ZutauiaulEd8U23o>$$z_flDex7J^< zuYm=?Mj2Z3PmoJscpb~E260a|SfsC_S-k>iy^eVlj|92sph2@bpw{|~;1;nk5VV?? z^i>o81Eril4+p@709Wg>wduu(ty3tf9swu zp#bd}w5EN_#NMg^a8*b5CgW~t#ieCl@Ph5$P47bi`yBj8pRdyQ2Z_0*_0~2lx3&Xr z?cx}xKe(n~xzLg1&w{I~^p&x}Jy>qBHgO%nn!<4qHjiP%hoT#FJbfcSx~9wP%O03S zKG1D*lXcWOW2-I+wcI+tx|z-sgK!=fvw~c6OU6SY1|ehd2IFvp`vPpIsvo#F%74-V zmx13$8d4$Sb)pH%Fxc#9NQNFt(IE4Lfx1-85DF3>_G{sF@H9# z0D6_k!!fR;6)JOmV`U*Ny!~=&R&1y>2CubLVJ$k0pmYzGb@$(YUkJioD=VaO4V^)l zPGBLojda@@PxHmw{A_&$m)wtJt1SU2=^$NHlzZ~YCqvLCu#l6&w&0_fql!M0c`V;^ zxwDFf?nM-8y7$O{mqKNQmntSY-@~%ZJN^8=0>6|3EIP1vciOdmoVmN2_8p!~Ej%`y zTUbjky#7|W8(hOGe9w+;>7Il8(sHFg?VCK3?psFj57(PZYq;B_U(T`z@twN><|Zd5 z(msUOE#{z;Q?u-k&SG(nH5I%$%)Y6gebFgg8c(xl`}Lbx!Y(ZW1Us+7r|gvk)!sQn zY$p_++;_Ua^2pYI)?c3TFvXq-dP&>NXYK_RaJm;$AgZukp}qUoEbO)a+72ovYCWfy z4gtoz=Znnm;6L)2^paL4>F70i&};6qCnqNZ!19{zzy!Ed;*@UgK^2JSJQNmRn#`}8 zK7I<=w#rNd)|E@xSC#DuaAq*wvD)!MD^c4w-=F!zTI4y;d;M%aDnZ-!%0BEv0%lsM zIu@CqeNJAn|EdISKg_ObEm!Vuxj%pW)Ve)NAnj}e`=IVcrN3=ue^dr$8$9#OGw-R4 z&k0sL4th9u$OFzx%C&4O+ae#AX5c&g&A#pXGZ2-pnZIRl{<9nz_%>hfH#wfjGxDQl zP)6oFWnShhU;4cHc(3aQ%juZz?*i;9k2o)QO+HiU-2AdEFwcqJV?Nedm$g3EOJ;b#T(^1)b<20#Q6Nt+0yb*-r~%DJK{gDK3OuxVW$}Imz9qlo!jL zS{E*+w5)Q{asz4EoJ8HwsTt{{=EUkGnV-Mj^5sRC6T5kP2(B6H%Zb;8g%h$`n#YbE z3r!JC?$spm9uFt*&V}OjmLcEoyRA=e4R;WfXO*}*=av@Ivj}P5Y%QlbWTCTIP)wt} zKZkJCt;;sVq+h^I%@KqfT2LXzO;Z3_J8>cQFdNV9T(i|)+gMG%$8F6Y$m?_nRa07Z zp+m6fjcN}r2(5ch>gBA3Rt23!eNjg5po|e&cU#a2S(|Wpf(B+CdR9S$}YWPbS!1c!tauCBGJz6eL~r z(`CMRPeFV6z6QWG+()b|-4r5_90R$Pb&%#hHGD-z->^Q5x}& z{wE!J){BC-!qf-BC7{yk8tw`giPM3AbOqWi>nac-)>al|BmkugLGNoKTy5bRPz$at zD=za3rXc@!AH22-algZTlRO2uRskn_dIW^nxB#k^h||%B@CsXjRN8q6i=^GDA256n zRsTK?Ed;ePlh3x&^_F4l!Rz_J`xs+d>&t2F>`MTt8)4z371zp%-vRzDBPhnLm!Or2 zd$qy}SBBhcT&o6spopP`V9q#9xcE{iYzlBpMS+~8FLhkU3T1V4C@t*Rljg^ErhzhU zGAbxPppa1Fo*u@?zCo-V9(bBLWG%GdHF5R0p9pgN6_`CUQP1<7p=9t*Gdr#VN^xkye z(Ie^Tk%>Y;))ty&#j`BjvTpgXymxAnFM=P~Zzy2=>%ac%P!v>n=zi%h{^BnJC~(i@ z9!0J4yf3(vKArPo{+!R9^pg)24tnTq;(OowUTC#XOiaX{?MFZQQ3wFtvkU=R2nesS zXPIa3GB&QOrdm3*Z*Tg_=blK1_Ut4k=1TgX|MIK!fBoP84^AQ8NdxrN`)J=UeeUt} z<+jR|uy%WnJ(aZkkN@#M zhQ)!POBSR`1L#5Y+cRulb&D zfBV}p{@Iu1BkxfrW6Hd9Yff{o56(pRAJa!J{gV72Y`-~ao6 z4}}OlFn#GuUy68oj?a#v=99---xXsvZDyMaTxEdDHuZge_pm*chZ%28z7S|KFZoV> zGcWUy*W@!TnH`_yLC1IbLhIun{_uw}9=V2aZ1=3ZFT3-#4&H12zDp}D&subO-8%RV z%j7$K_Vb_reAH1T5U*#xz8syp*SZw=I4RHtxIRwmci(+SQ6NuXZjfB)dgRH{&6tZ4 z7e1N@9|uIzYRYR)O#bfV;ly^MCydU;kQ1(Da#G9-GR^GW@L3)=bWW%rCP|mPhLRe_9enW6{y@Q!;uY_mCGYbHK(bBG09u^)VkvfH zvkxn-%`{7%Z{qH2FJ;=tu^W(0S3ZS!rpQP4K82Y6dMI@l-fLszgLZ&y1xDdz$f2-M z-pRMTL6revNAdOIai_cy1#qkY9E>Qa%C(01QUO=k`v0Lo_f?b;cO2)BR(Ip}DsvtC7I)heyA3zrO zY>~ka96nn|*xE8MAJzrB6l|cC9Tr@1GjEIYHC8j1)$9St3V=&Mhki@GwqF&XvW!JW zeSVekf$@U4QPsUeX{a)i#^oi1*#q!ZwTjC{cr6;_ddhH(MZMx}jAa5Ax|q{qq14N0 zi6B?kg5lN=D+gV9MdDg~W_*i#5U>kk)#veVzi>W;!h%~~(;AEp!G8fJ2~~iU=F@@( ztM%UW=1XT%|MK>q8P|QUY)+c@N^-#PsPsTJ@5^G53Dc8ELmrbtOuasP$+-b==xd)L)+y|(5=U&P^iZP3{+;V?n%0j`* z(ct~)=KWdV=w3`qCpFmJdnmk9BR}tn6!KXX_e%X7dVZ*~FB066&sqrjCJyXNUjX15 z#tq?d%3R)lGL0X)H|^Z4g%^iun*1lvyu`AD*}NBbWQX>ruYdKaG&H_5EpD)`N6~JH zeaS8?_!N52uoqH@c|X?_gm1tP)@PdQYbZ~;fAPD*QOoew$x~_cx6hyiQc2Ih{CfKT ze(?SD>@&|sxvhu7%!!GK_Xx(NpLFoBj@hC_#Y}~(?#BeL+@pGr`!x4YSwT@@se806 z1ic!~rTguktfPI@eQV|sc}N;4EYC^dxoznlS{lheCV5PLmfrrRz+Bgk?s0RU&v|&x zG|lJE-@2baS_L=9{aD)+h=WW z=R3zYdB*ErGhe@Jb>lNC94i|#PnDpxker;HjQ3e%dF^t%^3hV`&dp7FJDy2<+fr*e zU9n1k+iRjdRyq$T(-V-g&zo#x+r;a(fxwYtWsKAGX@8e59Gjh|e2>q{N8YQ#f@6U1 zbqulp3u4MQ=9fJi<#9qD@w)k&hh=vR76f&CmRBve^Q8RZck3fy=Xh=%eXmLRo?x8H z>++bt`EL2qyqyP?!^vOrqwh7pJlt>xSM>lmTaH~?F3vk`4Ez>R6ZASqo2PX;5 zdDQ@PG2{YBpSIup<~KvT$4dQ=|M5SP6PJ^thtD~&x%hR#n-^9$g8+Gw&l8o4G#6KX z&l6sr+&*Y|%qvfb*3Svk$?ONa{ygF z^;KLu-3Q2}d&3p-U7*Z0$}|p`rbQPr9+H2|34xDayXh(vfL743E$xfXnQm&j>&8xy zN`awT^B&Sy>#X-rg$v3uzMraCZ}sC&N@3)1FYSu$U+?0XR6q4vT0{sj_55+b0VE%} z>E1u%cYmdP(bDjP!WLcdHPHZWh9-NV(H=3l3dRTk&9X&HJ8sSqs3d zPTsoO+MrykGk|XJPN}z=*5`0r11}C4!wA=I!=r<^xzy!lE#mJ?_Yo*q*NYBLmOBd1 z=XTkPi|rB=#g8vhTp#h750ZFLH-)<2YSeL&dG?jCjv6@pnXqmOs~kY3ctO0({$naO ziGoL~C!b5J&F28b#>0Kx#>{bC*S#J2R7SCAmZ{uSmS``8$t5hWRuMKnd-9!h=9O|< zTKGKKZ>D>WOr{a&V_n0l3ZPB?Z^d(rpp217og}bV+vfP7DIPULa*cd*UVQPR^Q!Ib zuL@oiD5>zZ4*}1fz5AjdW#W*I>^+?7{o}FDT4t@dKws9HYk77mEnhg7N`1Ri-zx6n z`ia|ymAmhAUIxmhF0QC}TfF=KXYWm)>pHHx-99)YW`N)*QWRiGwk(+%ElbL4$CNzA ziKjS@oxHhKxv9E!>sF=eeo0j-e?mUpe7PUvxKbJFR$?c%6Fc^6Id*K>l81PZY|Roi za3(PW2WJ3qpQkq(JcL0Iq`*nsO>XRc_Rz!X?$y24uh;670rRxEknsw}ecV5nddaKc z74s~4lmK^S=UYSBz4w?SYN6GhIS%0P47}_o0QSeCRab4#?Vg#2(Nmm%TsXP4k_I=@@hd&rWS!J28f8*=nAO8Ly!cTto zi}1y-ek1&!|NH+I{_p?m{|NV#d&ASO91AbM@>-bSy#*AhhCRqdy~utwj{o&v|26V3K~DRQfP?Kry^z8FW<2VF zqeYH-3lH@}*1hd24_iY4dAWyuPEg4@FsP5yD$2UB-d$vI2%Vk%+2A+U z;k(}TuJDOZd?NgUtu5T6&^_54L;Ozu_#wjJA&^C*E-`HasDzUv`x79<@T8;g0CXQ^*f&s>#^F5=%Wjzj%gndwIyRWDdQEkO-n*W7e%9~@pF6OuJ<@v@a?S*{>I;yHbvzUe&sj^)$Ug>-Pjmdvp&vl9x2V*CX zUOR}c%|~aR(zOG7%AaW{75b26`}j!FyKO85BgY#%yZD#+eXaUE?Ynm8TUv5h}e!2a-fJ3 zguONjY$)G4eInG4oepz{5o*|DB!={T_UpWVGrk}X$b{ZA=XfLb6%~mp)!etGsB#7+ zsE2zuxl%lWd#T}>z9Ieg(t>c`70MAj1Aw6chBB+=OG#m;zAmMK?uX`@@dRlQurXcb9oNqnml+%`-o|v6}5zrdXI*piqn; zC-mE*Vx@XoR(D1cOPD6K%1j+*D~%DyRZbUq9E;OkE!8q_S~V34sa|0cuDL? zY4Q|vnPoMjf%J%kP%)ETM_wB9zw#^=c(Z@_5ZbByt!&#*g7CKbWK;rIM_6TwV%KNU z3QHOrEg8t#Y?em0U)LhbV5RSEK}^?06!u?OLhQeb_TgA++jTlJGVtq+#clS|8T$B;5aa4( zUc9%q%Vcj}#9y<+XYp9MmaUn9>3S4cEYf1J!Rd*~@Em}`vn*(Gj_jVL74{Jt+Ra{f zxClIfCF`;2W;nv0TPI#)Q5XwDnyh9nlzMT&TaT8ST~+oSqAkV#t)(b{m-pN|&wEfT z_VJjo`PeWxUdkh|_?QSW=^ob){$tjCEshapQaY7@~~7N zMZqw5qrkjrOAjzb;)f2L9e#UvFxS{#4Fl{a=suj0H(8eJG{o`R2C@>AncU1?h2!Io zKOWnN3)58eskl=^*t3af{qjIjaGbm#o zLNTr)S-L0iO2Er{wZ2u9TMxdgjH<%gkmgFBO~*P&vTb}J|Fb0&Nc1(b)Hl56k!YU! zoVp8jI_eL+=kH{dCjemGY5igwu#N>r692H@*k5fM#_N6c9M-?>Kp?|DufAiHzANC7 ztorQZez#d2$d(Z1O&W=P&0zl(U=pxVKP7)l!MfBE)3L=p^8}czZx=r#i#zLHP)MF> zzZL|tzSZj)?DO&j)3d%)z1yyA3xY@TaqHjql0b6n+C2Hb>6(V^!#Ly*NoOc8HV*lS z?ZxsKuW^~Cz`6X{XP(W!aXY42F2D1)-CQV1$ST6Nw=F@x&;Q8Em z{l@oGe14yYoB~&x0y)5SrE4Hh|4l;ynY$AZ2NpNob+YSV;GpM9RR}{mY<|SDt+GhEZy^LUL4fY z;l0khc%C@R+x18rO2nvj#XCX7rLL z-4`1C#%Jcya~>{&0?;=qBxZ5zH!&R=rzb*f&ur)&EQB2ZQv0{{gkykO$GC3Sy2IXm zxS62MEHQb^YT(z?O!Z>TS~J#GKVaDn#IvUdfUAIVzQHE8Gjr_w#usoQc3Z2(k%im2qEH0SKwEPfMl09Lhbo8K~hF1E4GF0M{mJG{jw? zAKC0$><87H#$6kEZnFmxxlEDG$CtC?Jz z&X)Yn6sL>05o|Y@WNW#jB^!He#ZBQ+29t>h>Y1++)(&OzS|*>>1>D#zv9}T~zj{Wx z0XN|@C|=J{acu_A{bcQ%7ydg{s$XWjOd3{)s?-_EF4|Io{d2V9s8FxHlw%upx@`c< zRLWkeQ6FT_97c-A=nzz3BAFYnOaNH~pp-V=i{nOIculLlkfO;K0pE-4|K~nR6)YOs z>{TT=RK$Wc0#u7wBQKs^_h%(R94dfyRhRba(#>HP)~bR^Dvixlk$ncE%RwwB7H~T_ zRBeY3+)@np?`QRFUw7!H&MH{Cr7e#rWcpclcIH~S;5 zm3x_cIa+@I``-^Qz3@EW;I6uYOE;7z1(haz)8>zWp3281#!m*C$a}P&Dq}rm-(3O> z*P>FZ(K42w<>CDRWVq2OBH}WDMQhvh_E|E=f0zI+Y;j4%o>}v+{S+|kB)kJlY^*n2 z%z6|606+jqL_t(_H`ttb6^pH30&pFJkHR~c*y>$jhC(J5PV#``#B7g<3%ut#jxKf16)Y3P1)v@y_7Xvd}ur>FI7JKJiT*vyesK+BQGQZ3O$u`3@=#9laP|LR{^egrORx95 z=RHxWt72E#R0XE#sIZqdEqh0a?MI70+vhjF@r~6wQ`zj| zP2CvUmX$@_8^`+l<3Il6cuyHwxnCNqyf!}TCg}mvbK9qffSMt-wd;}YTUBOhD4p#C zwqfhbKIc9Azir=Z`;8#Mr$7Da@ZbOa-?5IZBLN8CPyNKcX+IHY5InKo1rB^i@IW`A z2_zO6^Zl{0u`o&>H7@y%x(?G$IuFw^nAg0{-&oD3ewFIl{^OnNLSO8hRI^fIE>S}aZq-3&F!p`>g(=d)o)Lj>+KH> z6cG&Z5uC_GwoHO`DiEgw9Rlroc}S0$ipIz8!!^i`TYj6K#dwU5dOlZ3o5ZK@6qeUo zdZlOQiX*?j0R^DF);@7>r8$5b_CKhw2U~Sy8n=)AVP9`C92u;IR{^++{XOBfeM6yt z1lN-hWKA`>e*9Eb44!%cQf}Va7jEdUg#IuWx^P$7oWpN7Ryn#9v@a|tK!p#|x9i8e z=I*-9XXPd*fvYYwW&%3ZzG~>+)*Wg9ch%uuK$Ctz6To!bBGFN7jAuu_l98^GZryO7 zH$58~fbOL;9<9^Wn#|j{Ci{OzFt|Ff?KUmULP<&R%YlXV0vA0X5RfSixN5akl zTmseDD-VUuYH!UlwSI2bzk9*OSd&&pddfzf2po2g^rN)x2k5~vfx1!=>cmZVWP<>g z!&n>6Q{IZS?o8YtMAkwn-a--Hrd*30Z4}~d6ydr^w7e~4pidZLRYq@n1G&2^seX%(V}fswyXsC-<$$lNdcRjAXfvBYnDDg z#R7?*3htf(>$^)R$?cL_2wgv_%zZvKEuAo<5aK7)MoN&I7@@(3E<8NgamDt`h4&|p5*V;UvFMgl^pQub3GnP%>}(7>V}Wu@g+-tnyL=vkRBrEMOS@uY*-9)c#yk19n~ZXP=H z3d+b`VZOc)<*OEBVp7=qzHwQmbf~oa@sEETzV@}RMLEg1|MNfpGsbBiRnq&Na-Q;A zvhdQnL^;-HE*Lak>2|#Z%WXSR&b{M~J0eIWO*(_`DC;UO`<{wxmD)aY474#mC45Gk%tSTfHbpyq-pB+wrjx!+q-Q!=^E^Vf>H(-<60-uUNFKw zXB_qm`f7m;)l*0bp(-B08nc|BiPC71v&*KeImVcY;-dL|U*)>$SnQVZW6x`@Q2)TKphyl;>KHwk3gof2(`)UGI5#ZGHQ` zecbk;&dhcr50IDI&K!Sy-!`b;P#vM;ntayp%)8HRL*_@2%l6`L^W@m&cwoG?Ioq%8 z)!=X2exgC*ADuiTU8l3}+QuD|E%)f?Xgu4NO*B!e+i4>>hgPp*R?8dhLY5vYJmP5Dtp2XcO4d@3Ay7m`<8>q%v*PkW5E;>0-o*br<~Pqxfh2?5SJ5!3XlgeAMrNnO($uL?n?8zL!B*H)T@L&DO8`^V&#pE!h?~3hA+OZg;s5_7Ayd5{mg5R&}xJe7Qcu3UT&KLK`W7R6xnK3NWPnZIr+T zJTrc+w`zk-c6R`R?;H%Z9osmzv&xvNt{2%Wh6GlcJF#y}zRj1; z>{5sBS+Zyy&ZC^HHbRrLy2hr@s9zy20k{%YbXu@gIchze0lB*I22)u8_=6Yp?iq$p zuuB@Nsn1u(o6qFMy=kuH;evyeVFVh$)nXqY7gi6bv9X9?gLBH*52&Rp&ABEk!~v{| z0*(+kt4qpHL`}-GfW_7V&n;W4%zGsi%nO+!+&*y8bwV3i7DXhXqR7)qQ1N{JU>`*A zT6uS=iGTSS6b88dTBgnEmawwpEm%+89KkK`EepuCyTS~L!P8UADECof(?;FfXQ7EA zX=)xt16?`aVt zkX0GEDOzmB{h}bP;GN$`df`$m4><)c7X@hIaX|rW4J8Hu7l8h0ENZLpwh9OAAT+Sz z5@bre{6h04-?^w@-bj~h06H_)(J5;vV=A2y@(fHq_8sT1%Y{>W*6@|Im%$%(IV1;Jka^T`&qP?hii|-JI&S zP@tYnTY;2Y0Okx~B#CuvICD4qeJ%WzZb@nE9Ngf&NKcepoxjulcyr~C?Z)r@)GX%DyVQ zrKdEP{(u(RE(8y(1MA1{tTXG~ewF%zarvG1)Xf;5K&5r;cPSrUd&m<~NNp?q&d(Q50qa9v zWqk-j>1xo$)yadBb=n!Md-X)tiB_401X?=Ic;CGc9g9+*wg1YG)zuka=OP8$n2QP2 zJNaCGU|X@ieNVt!y_ptW@(lCoeevB*zPvg3x zfCGz+UncJ$=mq7>lXR3; zDvw?9TtXR9Jbo+`+2cn0w;DZ-n`(u`8PLH!u*}Bq(Gd&>8_2<>su2u zq0Oqh<)NdvtXm92OWk36sTD@RezsxFb?YFj&4L zD*btR{77h>ID)cWB|ei@R;Wi$mPDqCO-0+51@d6}x+v6gsf-0z4a=>b9YdkEduJ%` zW}+`mQ(30)JG`nE?viWj5xTC=ebo_l#5 z7lI4$YZMCtm{GYLfVmN$qGE5wPk@^>K9fEG|n^TLf2$vQZUvV2IxFt|!+|jZ_ zpe+JifTJq_m-N@QSOnGpzT$6PFxK24JX1JsT+aMyPJu0=z-r&5-O+E`@U=Mru5l10 z0WK}2?9X+qY6ZBiM9`YI%%NpzZ<#%jWc&0VEz0Ce9?>#A@+1_r^xR4}dr1oLsem>v z-(N47cl(L*h;oREMDwOxpk;;6Hu`?OI5%_8bd_raKa`tHqmOdw`YJ7i)S5tmNs!9L ziZ1$7Ch}XAp2~*Gh33)nNiXxR9OZKrsGg;v?-`zb_Sx{|FMm1KkBUeS%PCEzp|n;$ zO~E=%)+u9SW3kTSVnFK7v+}A|M9NR8{?fPC^I2L*Pi6Xp2M*-s7f73;&_J%mmDMHs|IVK+UC@A2|D?XX{30K+j#uF_Pg}`X3u_a z`i|-9GEGZ8n!L<$$Fh3QcI#LpU-R%?b$^z3z5H)B{rtV00&j!@Il%QssF#16Q{WsF zkl`ylIZ!z;I^ZO?cus<4`VMZcuyc@gAk^g7vjc_$n1iO1EC*%da)pSKBv&#zvGTqH zO`0$#;m7Z_g!;oj{KNRZd3mD)T`H#ewk+ns0q!7^`7|kWMaMt*=;L}5-r zAqo-*X#>!BU|=u|veEPK%w*VxeT4R7sFI_l1XF}-O8JoLDL-#O0c8;mnp(C$(L4(F z3HIbUaXPdBW>mOW%dEs~&EQtB8Mfj2X>Yk1c9$Dr0c(}bwoO}3fw;P+C*x-I?IW*- z27RP{gL+NM>^&QRESV_3vGWvP20 zEMgTD2_g!$8YB<`8p^|BYaW+=Zsgt_w9!FD6dJn3J2@V$xnKu?SSVQmkcw6J_o}ht zolR`F4~Hts6x|?33m6H0R=Ailr#PT3ia{;37E#KyW?2wWofWN)K-v;+_?oy;#OEj} zLId{RDwDrzqyzaI?hoBqM%B7m@rLWg%3xop?ZTpGgblx&SQn&Z&dTrQ`jHYR?+~{O z7pf(!w+dCPUM(}(SOyrX=%TR3s`G*6P^R4O9cISU*Q>eZUK{Z1!qJ-JH4a zM;8``U6DqsZ(rmEsa_D#vU;(6%S!-m>{~Pc%1@&5xaX$(B8a5hKtZ$UHqb^!d&EW~ zEMRTckiR+u^RQYh4hhzG&3hC%`tWyTlXiqV#} z%u>-D(+Aih@|aEmAWVzKF5Wp4I?6^q1m$8NKY7S0aCs>}{{|Rw-$vb%!i=LUKzoxw zcDWOTa370=5918mF+_#4@yT>V*h&RYt}Dn&9yQ-bGx#lCM2I^WmoAiSYEZkB5^l z{32}Y?+K%K-xKb<_x>=n@3!#x(Q5e7)31dlme=x&?i=q3eQ!NT9L#H*?4=2K)+R0E z>;hcVs!V=T?#Bfg7U45be)baumAe5 zD7&~QO(k$r=xV9pTw6KDBY`W*1S-aq3H(MG$wg>hs~}X4P_}VCuVs_+h6+Njm2r|B zq&1gH>92g{E3qCw`q7V`mww75rYq=Rd@8q9-nplgz)vdMc_X^O7drc+tL-hPNPVivc29;v^;#`i6P14 z=_uc^|9$nVUyYt#5>4ebN#|m{*pK7~wtICjwtM@5N_+du+B(`O6Q+?4>(@gaM`y_U zQ71LF_B!<=W0fBYZawzcW3f+lreytFHwM4)U4N^u@+_~k9u4y6Lo6yc_+0&*hrHaj zCc%)9zaf6KcpM*{Mk2dInGy6gV??+@;g=@{nsYs;_&*~+8HDR5p2fqoYA@lDHK64Q8@cNB1U(@kOlclusN1@CKuB$v86dcT)ASsZTrURS5 z1-bmKkm11LVV={VWj>AD!Noz%fyRlNLXQKjLYga09Q2&LDRjE(#A_$q#^?7AG;cH{ zT3H73W!V(G9OTV|c`_&@xiZm-q3K%>1_yrMHD6kPxkAxFP{GZKd#aQ8@&*1eZ`OnH zDQG)kFkR_j-V`E}faqkyd(vf~e<1X<03s$%gc=Id;WnEFS8CxF6d1!rR?rY{9^OP0 zSkYHU7lkbpXIOAGrm^xHpA41bxN)H!E>*EknwShl6laxrT-Z&%&OSq|Ca0ZlwmHQ3 z0ZUrACTyKP9-2&e7mgkebu3I4rs|=^YW3JBFJbd?4=4A=s-m>30y>pPu!b4AA+%7$ z%~u9PJ=Abrmw_hP-&D^63alVShgt#*83DlR2S_Oac2(I!EDTR!6^23&V1+K1xd0@c zBKtuJ7F9=v04qiS7IvWA!winq?Pmy=3GOMS&7BjGI=&@g_XjJwfS@vyS(D*5ZaKP~ z1jwQ65zQe16|Gu#l>oFVV7{O=`k&3B_m^bOz9Y++hgNPM+6|7P*CjyEE5bt7g_pwW)O%G-z3;9Br%= z7uyJJO#m|P`!7>TU#gO<#EX_Y+cOL09BsmVbQbIQrpJ0~k^Siep-TO`q7pmyGwYK^ z7%jd0wxJcpsW6A|*_b1at|2Tp1j0}ZVGdb9Io_qURas!G4*(2{EiJMdb5YT~s1=5a zZ$Mq$5S9noM}+I;=x&g<6`L1r#YVjv(tU0~%Vjn79(l+qa5*Vp+XEC@qMvKQRp`PR zlctF+Bl9K}5Ydy&$xXRmZ0=WZ#KlY3jz`_I; zdF+0B1i_+}8N5dqhw`AM8t#EBeWB5_mpu`0qApp?1~4dfTFgJJzspsJ*3(8I$u>!j zFki|l&iz#us?c)Y?wnt16yJBA?^*f8dA71lTHUTP*?Et1bL9i&CFkMBp|Z>s;LgvL zpOhzj*SL&ZxkJ#*)$0Oif?>*5?x(v}&fBO=re{7}#cw()GhHm0fE{HN<9nkrNoO7` zpFyRduBep#Mn|)KP0WjVGCgUl%pz@-^#s9GwkKK{hwoVrscuxdt1$Jx?zfUG<~znM zT|EqU-+g!d*1D0t(%+!WWE?(Mc2nL|mXhYFj*Q>BwN9><_8BvOh5twk59M;{X503+ zH1(eCRJs|YyN7jWJ4@}_=e7Z9tE_6>Sa<0?AU`?; zNFkl=>+%(?CdbCcqMpUNNjyrR%X$^$vL1{-)w$=j!RINYI`iClr04nh(o(?sN$o+M zo9+PpZC~^7+OaK-Z|S~uFYi<5<}=%peAV$nK4{;x-595b@5`(0&mQvOnYx34s~L1Z=s=|J za;>TyEFBbN{ssjTt(aW#&>0kl6!HXQItNhWwQL@iAx)V4?Zit9u)q16zloDJCvdJ* zbZ~Woww2|!j84KIee}`rt#5rR4%AKtOi$tSv!DHJc=+LmWBwd`Q!o$a)$cvLR=6~5 zRh>vTg94;^F_;G@vVwu;QQ=%#9p(Bo^`qOLljEo2B!+eV;ZBsJe*_4y8-?ovN)@IK zF`oR-n}h;Xr#fm^!nakT&DKMGf)!hCY{Z85^SByXz_O=3emu0-YSml z3X4N~!Yts{X>fqktZtve5MsMc)HT=fDQO++#<0!U(rlr;!-Zq3 z=;8_976tReOBT$LeU3Jd)k6fFSWM8K8^`+Y6v}77WXh+~T1$xd?jj8|=7~QDqITH! z>}mGtIvy=WYCHD>*p6b|rp+z2kDIcEV^4ENu)O;Ezz}IVKK}IZo$Ln0D^i} z0Pn4uOI=9e1&exFL@?Y_#a$>fCU^>LDRg5+T;ti9{kTv*(!m;lbdEj80kn>~-`3PZ zI5EQp@bq5+Jog!EQl=KxUF|mgo5d)O*^VWG)6wPM;BLmF5f(Z)&H`K?e?9`>_Hlu6 z$EHXNtTfv*C$XqHj_XoEZ+X1HNmrPJ|2@mR+Ijh|T{}_o-x}_`15kkl8mDI963jq0p`@&4myhopp5PD+YKm3`)Iqqd)(nXYn?d2){x^C}48ig*_snimh{ldTHo)A)4Du7X{; z&@@~is4`TVSY{RN%7w1}fAYyESLvGalFsJK@}zjBm0+KWN9m~Sshp`o(qLT5TE=a< zy38_7=_dVEN~+-3?UjmGzcnrEBY|_qlW6F59?no;Jz80xDzf#~vNlLx>rVQ*I8|WN zHsL*G)Z_}x??y*Qqdc1w>E6rhK`NXbtOMziXlmaQl(26IHcE5r#J$jL>sr*wtNcbj zr1uvA5Zk+a#$cT3Fy5qJI6LKyf8}+xF?}xe)6^#9t)KeTr(*lCPOanA2fg+^#}@mc z`ZUk}wmsNC-FGX2)9UgBtj5O1;yC7*;vQ7CBl)X+`17CteE80Hz7zSqZ7wYwNV+f2 zwyDlw9?sWZ%zJ91=XM&fcS|WCBlVC0J7_pCIhk=%@8NYCteot)ffq~y%)@jHrsX>+AD&Y@3NQ|$ z=0gG0cwKdrgunEy-=|}<h@Y*%L>Z4WXd#_FY1mCV?9xtL;SH~yP4()#%C0YaJn$}LsC=Zuw>~#P|XQ$_| zwi*w06lK%Tz7V?md&2^gQ9j!^SW&#Q)Iu@9ejzQuvnDPu+qhh6aV)S(y@^s!>ls(% z`|f$;+&IN^JcTDxrXs*oxgVv*FfQ2!w}*OlFq~komY1-0d3_SAPx7O}G49=x8r({Z zZTe*&pdXGJ*tZJhOKljeWd^0*3BUnXG72o&9s#(@y`(eHgNr8I84j`PZIJW^wy{~1 zjty6cc2NZ-ffbs@Y^6LJC5p?gZU8R#5hE-CK$cKS7AvzW3SjySuKWbNO1LSM7A5xH zDh&eEjqD7iCCbp<2eZHh-~d3$&@NCQfEDZIN{3WVz*bPo>;T--WuJ9ri3^mg0z+t( zetfxH6zSZfT!QWHxHEGe6~1gl^zQ6AV8^S;FXaJo5M z#M)A8t!NoW8d`9~J$Kw|rv`8acvjt>0beS(wG`9xD_UY)f+FWp<`mdc3cx!Bc(mYR z+C=Z>VD8kUZ*^hK)nre{8F*YL2iVf|*NH4~NxQc|c^``@T7v21t^{xC$MUxh2;U1o zjrrw|taSl?G|N~zL!Je>#sRg)85<`6xMp!JyC}cnXbErub}cPuuH_s)j3@i+_y!2U ze2qan@|LBcxd?3A_haxmAeMAmf_yZV{e!_~mEAx4$_XUf8oe?A*RB+<;?!cAs_g?@g(_T{d~|7&d~wWw>{f~FQCk&x9 zb$_7ep3}07g&d@-BDG0}_u4$Dq*bO%@=arEF&U0$M6uRn+=S z`U`kT6VJ+tmfN$zHka}pZ{&Z@OM$iRL%oBt|NGzn{%GwWO>OV;7wbmdgmvj}ts$%< z+otyqVPRz7vyN@60+H5LYKwk7{PCdYhfl=G&ou8BOp3!y*`a9s$s@^`O#3M7W=M8|9WUVrX$pNo?f2Q?># z4l+(QU9IPeHzz*czmSj^ei|4Z1ReNX$)Mopq{;zMfzQd4s~)1D0@F_ef$5n?zg0L( zAq`sQ$vpepcQy(RJZV4?;Bo>jfa74}iarH6)AC61drsFI#l7}f%8&WeN4zUmk{^Ea zU|C$j;UH)Foq6}0wP{``?bqh#T)(BWM`xOXiPpb#b%mt#Xh7Rul)wi{J>dWo;V~4g zJ5Y?&plJh*k_wdzYaQpx(HpyOKGFd+5+hTQl3l&AxUaXbtxuYN)V8%z_BWU)EvcyEXrs_; zVKug-)rg9}^G0})wL`p_Yd(M-K%L?sJIwVCVx5LEZ+0m>e{wE7e{3ck8J|Vb0>Fh* z&tP`E(oNekOYpb#SHnQ19ENb)*#q!U!5venR~K-)7E%cYz*Pm{>S2$DK{j2+I;uE; z>$tw*u+%ezl~E7z@lvEqO2P9cgWts*B|>Fq@4{fviuHg~00Lp&P^2#xCuUG2PGbo~ zxyipEpL=hWyIG~*U1h~T`GXc=cqjX9@tv;h*r#c+k9&RF!xDR~t>sah%;^@two+a| z7_9~<3}nbG<|K*M5z@5`pMs68)>~&LY+E#IKrqIc8VcnGmbZ;km;vaUW?wli20FKa zi8NjLQ_!l*5b4i(<)^o@Hp`9dzqd9KXitDyT5mN0shaD-2wP z4X~mgg>kVbEAJ{WHgyaagU4|%c?;j*`+n+h{4FpRtps&VMmuOvos4modWHeA*cS(- zwu|v;MF4n<>{H0~EsGn&9V%PTEo|sd-ch(=7R!1BQScFvp;SSz465f4N zA$|HdTzWcT97sX_v?qB3Mbeb>|2MPVi8FfAjh6?C$fSTG%8w^ z7nEZ%x^nlnKVh##ZGG z%aG>bDw|z=_ZNTh7vbw)|9Ygi3-g?dtH3v|2OoSe?%^RF1jT&joPDjFl-hb4uhZ|f zL`nCJ$DpE9IY4>9d_VH=!{IZZ`AqoX4}XYU@V)RFO1oa3edt3U3N`9O&`pKquh+uL zop`eIaX}kjFE~~kqFmDP!r+s|+o{V5?i!y78b@a&5 zNWcDp{-`X~BZ#!`1frC^tP@>DD%Yx1)r*KUmcEujrM(9DXaqhm+){k|i;@l&>pVv<$ z#p)mXwKNyl(lS%NC5S8UkcNo|`A*Ug*k9iH&UZ##hV-%m+yK%^}9%<{7+7S%S3@3;JQqN&Xc(~3OJY~ z%d1WXnqo_gR}e)|N1y7tdvHSIAf%uwz~sQ9z$PD8gj?O{QZyo52S71wF#FcfHymL6aG z+Sj5$Y5APwNgLmDfHq&A&6{ypzV!r~l#c{lIlxH=X>3}S-`|>PE2J8yajm80`O48* zrmeb8XM5GqbS(yIy|R zin{(*&{a|M>#fXZ*>m@+@LKnXLMq)TwzVcZ&I;iZC}dA@RCwoREIUTXtLwIXKg!vh z^RO`mq*K9uWgA7m9Tjl8E7Uy_N(xt(&o>rm(|}yKNSa*4r4R~^2JfGb#;f&!g22`G zORPlKQcOKu+(X6R9w_n1!lkV=G7~{A1ivo!Dry4+Ez*|Ui)n$zJrB4yQ)e$1l#J#j zT9lb3eh6MIW1&S6!X)p^v!JoH3_k)9iE*NIj4hVm#WMR_0eF>q@kLJG@9NPiii4Hy z%K#Bt$}r3I1H$Qxdi`D+nT+S91q+DF-vwSNXe?+vf z7A8ZIz#t}R&p+4D;(O}c%1ap#RtD_zD4~E(;AD(}c&#Gu#rwQdRKclYnRILqwvDq6 ztHFGD-}8ncd!bNd-y1EdM#eHwlC~JFs{l{q-Z=IzU62WawOZma({q?guG@U{)ytuqa@u%QDJl-HCPKzD#Sdw0Dn|7JlcEl`yr<4GWP! z%qeh1DG+-R{mn5ebkR==_Rh!z&g6@Ja3uolBJu&}ST)f10TvW!DeC@z$r9e&E|Pyi zt_EXboiT8pv1bl&ZVq?8_4!s<(7KtiX-U4q5z7ZZ(mmsbLkA43i+!~s(^`iBT5?5R z66sUGWg>gsl1~@3%+H+;voqNowgfYEu3S|i%6!1R0hj8yFTR2O8MluCR$*P*0sc$v zI3CJ`3s{ml_Qi_gPh^ao9W$Ay#rY@WQQvS+SlZbedgu0r!8+gtX{c~La^!FXAe=|5 z6w_KqAjUbh_YA)0ygJQms^KwQ19g4y}C zGR8*oj!I?alqa5eA}aBfInv%G#;<(gGt*XnQdUcHiD_8&PUTq|Ba{5HmK^5C_XXCp zUQ$u1{PqNZ*38Uon4X#p^T;qa>=+5}yz7pzcgMCcH(w7&UVAk>0j&=lxFhV_yN@x; zMJCpGtl+GE)8NNB$_lB@*Jk1zzjf_dWS-?-rTcbo4<9`EZY=z#!k7N-tKpYVKNH*K zGWlu%2+!B&;@(^;7nNajv#1Pf`>?(Y(p@>vHY}aAP?O$1mj+2*6Fjjk`CB&jMCMl5QU#%XbvF%V9S{h4#U3_|09=Bafck51Nxcy7ZMRgXoSC#J8v-%LN zMN}eN|Gt~*ev{dH)4nGC4C-IBC`}e|_62E|EFYz(btB!!#>Qg*@LC;4isMa7q`Y9T z@JyzXH_A)ZU)dfKKeW#YYS}mKXTI;E4f}3f{6c$jobtZUM@L6vzfA54ZA11+$8Y(x z&t4B6ydW$QJ>+3Kb6B1_Bl@ z11v1BDu&GCW(&R2bIcQTFR0=4psp-Kyrw)6f#Y{U1toT9cP_9W*J7ylkq02+ z3g_NE@V-4*^X$GM6t?dP0U)GRu7?)Zd8~a73x!Ik5|Yk(V9FQ)6s3&Qp12{p{zbp%kUyBiQ{X%Y);tV7-NtDF6Ehi?Ro&=Z8?jeN`1-`T&&Sy@fZ zjCN#}{nD6f1DrA6-lgY=(eU=65bo}8g!btp;kjp@4nKP0@#tB=MR+R51SXUt^upkx zv1mn<=(27px9+BMcjX9Iu?q?*;|Of&Zry!@Rq&~_SI$zFND4gX{T_b1HrPg0_Nf#U z&{96r`-AiG4}S22QC?D(Fg^FjQAz!$fBL8Kerz}7NmnJ2{w}($ z*K)>u`0QmCJpS_MKMl9P4OepSd5Ae*BfNCz)$s4%cr^Ut$)_+NTnxR;YX*k4g$i?w zI71*01@c2iI5;yG>2f~ek>Zo@L6~V2EwVebM|ajjU7aMmbJ8 zD<3KoO9O$*v9YmLpyeD{&2L`>1*{ioY#rDyltFEOf>v&!VEy=9eSsF7>J04v%F`;@ zUA$|3+0U$BtxMz)S~|K&)%cA&)%!(c@lElGeOy{dM``76>FOc@d5L-+`IP{d&s4^z zej|U&!}UP{`-*xmb$MDQyAa&=V7pM4D35fkwe5ITr{=h)&g-W?{b|&f$t!I?f~TI< z{i#=z$Es_zFFGcAn4a-p%fT{OHhGsk%C<6` z<hK&srTfIN9gAJ8g%$z2 zbZ@1L#u|LOyz_?8wQGM^!Uf)9xj)nawVKpJ0Y&Rf6FP7-a9wqE@h#e>bTA~#fvnMH z_s;ouMUl*>^C)s>0Q_dD<5?^wGUc<%uB@z9R~f*whMUP6mKWW)FzlngyDQKWFw{NT z8nmMYl+g3I+^loih%7o^U?7jwi6XSDuXlrXT2Gs5}SLO^(q#GfTKlR59-#? zcMI_3GWF)0JvZKS#!?G6gk_!!o)vqxaeo`&)s`IbvKQwyT&}r&`SMP}E|iF4ryx4l0_w7^#J=o~@mR^E_ZezAvUfdu#Bs%ktNnKC zilG%LTF?+?$HT(pYvIMoUxx7o=KsvqUG#MO?RUiejusZ`VQzMYeZVsJ;9V@(DC$a; zPw_JdTha0+vxapK%HoPkT!ui0oYi1aEw+D3ykD!a=PQ=Z!?^R^G1wJGdKL$$cxp?m7mtT(QDq}tT@WWA_auHtg(xI%P zOlR7bUl~qWOnFNgMp;qXq>%FDeE&|Y&7K6b@;k#jZhw2YX)pURGM9G2;xzGSy?p${ z$?(|YkB1}2PEenjEAxjQdMMn;qPX@VW1{gh7m5pgxGpePcTU2@F*`1_C(_=dl_3k? z`+G~_?zfJHhaY-pc<7#YgnQoc_VCzGe-#eBj{qaR65u{rKN|@Y)jUq3p14qt$W|e!`4wins(NKbt8?fJC*0k(AI}~1zi$)-}<#5 zD6>sisjdp` zzw%S{f_`J1w#(EuFGYDSN1XC6`;Eo{_9bbdC#>Y2(Y_=gFF@}c!QZ~0hnxaeiUK*n zb)_hur@J8q9AF$66n4J&#V^JQo*%58fOHNT3OB#~+rJ$?`q7U@2JB|KuC~w(Kw4Fx z(54`y@MHW=9A(tTlLoys5%sqdN+&)FR!)K(@Dv_o-cCvdbX?VV|NZyJ0nYdZeoRBb z%>gulaBK6vAptJ(q2(~Y=IxP39*O04b&3O$;FN>2D^#3Fn@0ga%jn?jpln$j%$*#X z?=n$l_eG&!p4b+&s$LVtDVn9t_)X zZ}vB*PlYE>9}o4prEmg8`W{y53LXhW^`ej!=u&Z^g-;8mtYDN!lOuCym`$$Dw4fEn z4WW+G!eDC!bOzI$TItY#q1zt6nfluYextJ z0Pp<>xVW!_n}-=bt80Y>_%lJ7Pb`4+002M$NklEsc z0A3w{YaI7qr#U7#rYNiRodH}lbNLgN1wHP!hPB&JUnPui2x@BS2Lu@1i22?4Tq8`( zHp1jIdzC>AE&P_CVXXV}Q75($6^~j?uK%)oYq=j+w9GoIy-+gxqiv|~ZSQ9vq6Wb2 z1l8Y;U{@FJFtd=g8!feT3l`hQS@Eo&ZhkkXz_m^R`{R`gS=w-l*hfh9cg=;nKm5V);otg5*s*;iTF1@J zvHvD+3!BWRnFzTr$4Xv>Yzn4b%M%tQB~EV~IealiTAgK@s@{xMqExR^|D49>;VUNK&)JWJthny0%L zcQ$TiAY~b?tCW#kz@}#g6`9KAm_HWuZMFMQz(QC9ib$37O7{mL`GuY4oO&@Ze_xwgUfaO+|g+AZ;!S}-xKly3s>+$=g@XM!u6;4e~Vf70jL7Tbd zW&p;wjE15B7ZaoiXfYq^Voo3DB5n3|;ddd5y_@dr?mF zJ(d3cPKWQDuO3r8`FV2`ke;!olf+{^x%Vk3RZne8;vgfT{eh zyzY1E9@ItH=j{L1nSC*@ue0kxek8pG!KIlx3wf#hD*?IEGw~w7mX>+AekfqSv5nZb zJbM^yFGcswnYoz2G0)m~;&^7e6NvWP6z{c8S?T3CYF~Ps zg&&SPj=9oHJ*bN-)U#^o=3*G<206fWt=Iaso&Ox*y0+`@O`CfsYzkU3O;=UQNF8*% z*BR2p&ie{MGFQPFR~aXTO>KpBT|Iq`A8Qi#(Z zud6&{8d_I#7 z=HJ2G0m?zkGD_o@UV14C+R|QAe<#@v_{Jf4=76u|mxH=1R}5GCz;3yUC_o3H&Df5e z;Wyb^VT61)5mH}7^L+|1Ny{uP3R0_EcEZ9tbu207`JP=G!mkRGp@d|L^R`T*5$DOk z3oG{o!L;6@QG`jfx-`s*N;|Q$Bo9rWp(smkQc?QMwUeqIlxY6k+ zkL5CZg7N)PR*9Zu)#x_9?K6MG!+P8J&%`$`N?SvD=%m0Z?b3x6xO$xl{pn}tcN<>& z!4;94gtus`02{4^W@t{cr_uOCC=LK}VcpU{jB>2DJz6>SRsld*c)Wmx&Qznxep|FZ zzv0^o?QREv$3PXu9WIuNizslgs#&7nFJbMa>%(=+w{Dp)lzR3V{?ivCxD^#g09vFU z7G}fJ919Z`0J(T6TKJ%JEL7QxtHz+Y#VX}wKS27KN1MI68tk*o67ex;#0{ScavZ0M{%ap4NIT zt?+mrtr4(5(0$f6_AA?ib-`}V+X1J|s#L-g>z19G@ zdN}&3SULl8@#Pub6|qTV{KNH8?;Pu)x56O5_tEcAN?q%nEEHZ%Zugd&pqJ$m@HFvvvyzPH?f1yxVn zCr+;nFCIA_CZ}e@p;ulFb1W1haatbn*^i)81i5gn%jR*+M{sk7OUq^Q=7O7)?phjb z^m`Gy5p%d{uoi~jc2l@%WFYinN&WU)ZVvBnF{fd1T%Go*8_kzrdXcuh6qT*kk9DO? zYrW|vO1VtBtd+&2kL@cRK2PsmOrAF?PyQ^Eg{7W+<#MHyY$+i#V}t;e zHruuwr+n9bX&fHv8Lx#PP0V|uf#bY1k}e+VP^E`_$}w1dp+SA1dQo+TmRk!+X(x^H zvE*8)`8RJKbAap3TesJ2$r4kPnQFeT0C&D1V>bA$gOIBX6qIyV_>qr%B!Vz9W+#fq zCsQ_j{_~%Y7G9dw>I%aZ8EGIh9)TdOo@Dki`QQ4j--@fP(%_c{1@r344kwstwO~x( z3jJ}?mL_h=gxah~Cl4pix;+uN(xh5iIavGK`=bceZUQY}W%%Crz83{j=_!b)Fr{E> zu)O|u^6vYBYEIBQ>mepnv;mJT23u2 zvq}|V);+M?9Np=#txaHQMU4^LT_!?je^r3Q=bU*Mt+{Zb7WZ({%^d~|q0%mdcj12R z7UF+}ywHH^Z>XF~vB zf^b>NR~eD7q3mQFWTkQ?rghg5V&9?eE{M)&N6``6Ww<1x?vvy`V$B%Chc*$RgM;1lXcuT0Dde%g8>zH%oIuj3AE8=0WK!Kf@czA z-6F0_B;Q>3!TQ8VuS4?!ljZ1+u&E*mB@^J*;>5|YG><|FH;7$WU=~@~+*L!MtpI9K zuB8$#oXUM+vDP2j>;s19!LR^5=5RMT$7<|(HW@pCHPRFy7fZCm5iFAG-3z#+!ZOJ| zdaVcOXED0?)26OY2yk%-RLx_t*96$}{t`UR@k{qv-6&m005o-9xfcc7&R(oo0YF(J z944^(>#exDKT{ab(mv*lYetupR0C-t1Fr2h7f3}SA-@^ZL1m>UHUSAt`PC8~L-x`Gao%vbKAbqOI&p(47ZKl6rMbEBz*s;PsPPP1;$D$iS{7`MP1QeblJ=# z3vg>XEKg6wImr_A(0$>`K(;nJ8~z5KpsnJ%lEpeZhI>PaHru4Ux7@TZ4DEXhu6nz1 zDP0e{cJ2sIKeG>dosKfE@|$v)0HVtK1c)S=RC&<4HC$+$*f7KS!}C%=dV8o}P!VkV zPKspPunTB^_`@GYmwF%m@Q0%;u3YXr_OY?Cu?Se&*RAL8fB*YYPWL!EskT zqWZAM9(ycW7(4!GX=(p;alH!*640E!J8uG4!3&9RIIgC#LK@j`yl0sl-wz!+6!nE> z*~R@D5NJKDF@ick-|@RVq z0uRln0;z}B(lK3|9VgGy#j*=}DI7V7d+j7T(Ouw65X?!pK_Sy1ZPN-g2SSe|Kx_G6gFwV^`BG)E6@ zZ4ayG`uY$=X{*xKcBrBTif5KvTsKjU%rfX7W!1~c@zbG*vbY-;h!e+7h96DMgen_J z@85HCxQn{jL3?Oql3^Y!oolk#7@dMG@Fb=eWXutAhBx=y?qibuFa6zptTwL!1oeg%AkiQSyV)LG z)3L%_D<8q!Zj^b0tW@tVvSD+y3KH0|g?n7WK>k!DX~7l!*#QJon6O;OdJ9F;;>78& zIES??{V4RYCklPh>p~4stJ24wX}w{Nz3FD!C6rYt?f6&6t>OfhTGLpo&EaO~^+~K) z0lZX39h+t^kZK(dLuWQ=zl5c`?3Hc`rHnWvk=c>ukZ;1)EA?ge>nz1Fbc z8t&103*LiE%DuQN++JP`gH75Dw69bKV3if92p~$8%whpHkE_C2fU){YQ@F$};@4>= z|F#|4R&wt5>-5R*T(=Y`Fh5v^ueDhe)1HG@&W}fsrr15mo=;fZtSGy+bnRjxO^N;M zq9vsK)P5EDF64`sba)mx#1PT!)bCa-CRh93C7gknBxNeFFd_DL^KZW=KLr;1#1Jj5 zybo`SSt*1Yx7EVU+u2b5r6b90fImsk`n-=S(dnsS*o&DA$S~~$eIiEKVD)F56o2Cocl!LslOr?@tSweZr z1$BZ*&XEPHl&=J&l&3r^TPRDo0^B&Xu2AW(0?lVG6jY9IMZE8)#d#g)mfThe4WB8As%c z%!T^)?+Q2W+8*BimVLOv9Sr++ZDW-T?Z7rC*eQsmWjSqQxjq-ct@hMpbP2tLHN1Og zrn+B`*5|tCUZSF96Y_uH#pM{#+`cwMGqyHUSo-&1#!0LDN$zxwFfv&3p;d`35m2K$L)YZ^a%-?BR1Yq{oJL@ROu zW5-##W$#+~arAtHi_R^Zn36vA0&fxnFfLCL%?3Tl0ZE!$x@Esi;jf0Yd znGnlZcjh| zTzKKo%V7Yz*LeR4+_b!aqT=>jMv3R%aL2803;Ph-qw6iwv@IV$c_REg%!el?kA&B! znam?tcOzii;bRSfl}RxuP7!BuqP$hI!7)_<*uj%dOc^4X2ug zaAXz%7i%MQieaI>7*5X67Z(J$y29aclz;5I)ddK4Vrn7GmFjVSv5QknZEfk_Xlzk0 z24B!Uq1Jfu0N4`TYPtUwAfJ0@Y2~LTtp|nc2nyO={k5k1LzTU1qzO= zyKwYZxTt+40$$baZ()DJUChx0f?%DD2gTYT{1qMvh*e;5jrZci&JMjYmvPz8*hr$iGsw+{ZMR=t1R;Uu^d|GdHce58DdpfegR#>c0ht~8l zexnd#jHv*C^a5^awKakj*G^ozjsS8E!V|0VME|YOFJ^@w(Xt;|p^RBsm7^xmMgHBh ztBZvs?%&m01^^RG#(8QADx6gO z`p#OpCB3uuoaXLHHgXQCvd+1^b9{j*_cfO1JJ)sIE1>0j$_Og;1if@!t}NjA zl%IT8xkHdj1(~bAU2v$(rSi;0cFGv;J*HgcDsku43EVOr%d3)K*GK|bDjAcUW18kk zrJLu@`M7O*30X#Zbg{>6fjLk=bDOu}rgE{`#&zW}Tv$%UajZ<;-?U>_xMg&2c=rSM zghJm?SgH&%b|U}bCeVFBwFuODi;a83@;rMx&(cPanHEmrGO@0!W2hU)sI^qy;5T&b zg4RncFj^#yQa^xnAMJ&*ba!ESUuv_kt~U&Aduz(csHftlp9B%5rIll;*ZQ^59YpR_K$R&KUmJ@UvSQI=Mwwr$#$eaAj;e@ODR*|D$u z`JexJ1jFP3T37nqe(3^S`^$Rr{uUSIs))`uY|334k8>uPKgcO? znJAD0T$hQ^c`}!e0y1hDaVOLDo`Z}G-GRmlkk9YE_ue>QIaoPKauVd>#L`ti$t2l9 zD@_{HKz8{`wDl=jhC~wwF@rQqX9s14Na-T2q>a~U6`(?_E6wh^@4h&xR-lq@uBdbX zyryWRPNvLeq64hV<-$6`*2SK7)JXWgogJ_jECI_E&ExWyKDQ7&<*I|B4sVImUxFP zZ^GN(b${r`@@D?AABAHty&QhAxDZ}P(eon0wJr^HQ;4G*lrvXA$!w#^!_`Ltlq&us?|4 zQWck-u2K#tca}Vu6fYq_E~7nkf{NI$ZN*-h_t{$6?Y+@~xOS3$GudUR2^ zOxh}v+S5}gk;X%Fawe2}YxLh*C=1lk4;Ha9n#YCbsm5}61u*ORlXKxTAeO74o4hm5 zK2)-Ej!(sJ@}Xub5yxTi>kwlJ`>D>RD(xGUscfW<0& zvxJgX#jWlvNzvFi@{m&?r@)n@fFRW}3iySizYMd_eFqCJEHMRU25*RG_pB4-T4o;6 zo;wv9xb9m5&~{OQ&$?LbkXc4yNz}JJR7S=kqtF^`32-0+Vm(8lJhT^p3?&X@hKhN= zG3_&aK&F3&@vr_`xwXnIBL7%JF?hdmbya$a7Z{4PTT@44+BNue_ud2KxgO?U`B5xO zl{}XEcak5hUmUp_v*GoZo(|vn=iTA$cN_>e?%n}dfSXh1 zbLP=GT!}>zU0Agh*~_t~7fYc2?N|j5U;%w3EF5_%bPx71UECF2*45yDgWZ5zxOKhJ zJqrQ4so(T+bAI~LL(*}S`(eZKl?xZ^v1Ec^3ArIXxSoori`IWLl@yGwrUIU?c8>( z&cXKXqEbQP6uhU~&b#iy@)VHxlb`%#)K%D*JpBH818(fw@(lrU74eo|o+7UhC{&lD z?!s$%kNoO-qfu%<`T4>rpzhCp<=ADrlAqdsyl3B)-)cQ+|MMNkG<9V5bH|=53H~@n zd)P-j)c1Kd|BmA>2(iy3fY|X{K+7@T@;H{7e;4~FOD*}1a}A#xw{hkD>B8Gp{>7!G zKn`$STKeX(UjYipXr1h&l?m%*L58g$pwM>Uz=1fil-Va&e8%C#QlHIEjvNGJ<}!8% zEC;n~nW39^56hwOn1W?<5K}OA5HvW5JNQWt>7y{|I|5*?CR31dRZEKVnxzZHRXr<6 zbau!TAJM7`aI4hErrJXY6Enl1e;5VN3h1Skmdc^CLW&B7N1+Er0btnf6~%>*M&Ei1 zLUT6Rh)Q*Cy5HBTunRC&Wio!}9q$NtqU0&Qd^$XLWIUY40_7DfT7H3|$rSHlHS-Rw z$Eedh%zWL zcT~ofQOK?s8)P)Qm@2*s>6T|Hr@%E&0hJi^`NcUbT>-ZY1$bj20#QBD)tP*G5x0Bo z+0$6BJd2grt6`Bn4h540wRFw5%$QK!bt@o~7E@S@pMHh++5fOP$M~_AcUjOB|G{61 z9Prk#1jw~A8pNT1wBs-kbK!_#X0jjYxi5HqReeZi;T$~gm(H*s!%YHD- zXgR}pf~D&W01|d>lpQ5i9joEV*Dzqa6L|s4Rlo*$rY;G0VDY*~m#$cJRk`n2V`);X zE0OaX(2bjH!5&((Q{nK-&xa=-`*t{umA(rF{Gi{(Vh=qCFx4NGvC-OSMM0%vErCmd zKPuK-EiSn6BSsJpA6YRfOq!E$uzzH^ym*b-R)$Wh<3~${ETW?)R%w&3v1G1=Z|q5p9)O?t~2eb zgUaU`BU58xKrLb&Xc}Gac?l3I*yjFk+=+9XBq}4NnROy4 zVm+vkwQknUOGmcy%S%rI+p_(__9#GQU$Fn$mhHo9gMHP*cAfgIacDuQ#p9p-*`I}j z2MlQx1ycXBU8(nS z3`%2^{8inVAXc(ya*TA$b9_tSm+j7Y(wMjT)VJnM`Ar)8Q;fEK?>Ro`CRHm?$Ibtr zy*Gc7>$>hdPiAFS){d&ez7Rl>;7*B@NXwEfw?)|+D|*Iu#JDx%up`FqpZXX7J01Od zN7y}WPrKW;EK8PTZInogq_~TVh}(mB8A>O@Jn{K_zV2l2we`vT^Oh&g_4nMi-<0Kw$!n`yqLJm6K8Z$}cKRLaC$5}_ z&vkLXbn#o2XA_+{pO_FB1;eLgIX9OjJ%?a!Tz-!?BiugEIvQ`UEXO+lTnh-o4-i6U zl=CJ_us)A;q4;zEP=E%IA_xj@@DE)izzx7Zp$fYu7x3mnf!SS+DwgLxqlC2CJs16R zOVI=Pq3WbUI3@LMU98O|;9GHx2|RjQvsfyl%xSU?U5gMpf?u}DlI>HZL&Z;%elBR9 z`a1==*d=nSv~a7(JiF!wj_nsJH9J*hh^G>H>cQ1sUO*W&(+N*Fg$LIK6;q2St-AR( z*2C~03fTt0)ePQSuCI0Q+*}+7;F_2Mpd-^2%IkVmEr~-2uVuWpmROgn3x(G#_bjyl zxL8xea@;G)I!eGd`!vSVCX`7$w#q7iRDFci8bLw36$RdA^ml`VHml;*(HK7+bH@?n zmatyjc076s<=Sf~OV(}cn_TbNOrNZ?-lYD-%(ItLsCFbl`?!m|ASw` zdweJ3U1!W=uuS0!yLv|mM_5Z1bM_qX0`%zv1VbsZGB_69{U{PQjYR)YFJ9?AQR~IC$s#cR_O|i9 z0$=Ew#mj|pNdR8s1IMI`$$7=lfBBH9uvQ_wui**h^8~n7ljE#> zA3Svzz@anTFImUxd;j{Kc*jNI5Tp!EO;;sRr5>EbHMY@*c8l!oy@{IF!;y>5YI+yh_d++rb z@#5+k0hmhf$GhJ5+eZYQ=@$lW zuF#&Oye2oI0e$YO{xmw#*uuHZc9(TP_T{w(<~Lr#JfCzzpXRyMd~zRfKC}#aS6gO} z{SJRSS9{L>;F2!R>+1IM*y1?ieSWWfN4~;y&d+(QDf-aO)LQY(?VvybaNQ0n7w@?1 zD3BRI2WhvQ9KaQVoG4_3+zf;9w}1P$i4k?ZsWAk~do?-vx~-pdoh+T;ocyGnlUm-K z?6Q!W>Eb=+7{u!DE?Q;fzjD0_fMF`B@J!xY08B2X zj+awg;K{u7;z1cx#@bnc$>g;ZS}>{kEC}}|P|1rZhExuvhdbbK=eScgyWtA=rtV0e z>f$($3o1kHLS9FsN=PiM!3o#nrn0sP*tNjgS{LweJVjW>lM{D81Y-*~keRrIZ^&{w#iz(kHU+i{Z4YRX{Giw}^+z z5?j$j{dB1aM9kT|yHP;krqgXCOD;{GUf{bLMhgg%%-$g1YP*C9Rpnw3E-dg=* zznMTTLz^|{Cu9E5i+G#hiNx5B&t@7&4eM7O#%rH@1h@pO8ieF4odNU#P|}0R@P=K0 z+a;dU!%I)86$Xap?D*=KiPED71<2C&SQsqF!ZtjSdg?K;(i7baJyFLir4Imz3}O+G zs{udLbf3l#t&HUxohlHLL=O?FP zdX_P-t3PUl@9hAEgn|a}>S8YHK~5N~!5cGf_A+;NGYGoA7E>bMVfif{KS+j~Yb-6J zFq)0GUwkJ-N^55UmQHsJW|rU^G+ZmQCRc0OHV!C3dE{A=@eOTK z?KsItgE?P=z&Ydsm zP{YsC)3R(RLIFvh>wK!9sSnckxF$g6c|kzyK(9pQ)qnoye@@`u&wlo^ck101Ot$W9t16*0z$I8?JGYGs$_j4VZ`Dg!Z?<)fZS5o8 z>v8U%e#iY(xB0vC_~2OSSman?pBM0#wrO^{i=m_U$omYegn{rbfhUreEcZJ)L~pR@m(r^jv{n{Ku(`kZh2+-{3c`rH$X6 znf3KF@IEI=>7~Fe{S?HtMDv;aoD-!JXSVwEnd}vo?{h+3pZ{G+M!q?PFjO_u(azjh zF%@e4XFhCxKkT=SOi36;GKVr-{!aI)Ht`965lIE*PB+(Z(n%gSH}>-4?t78~wnH|t zATgy*!}Mh5uuM29^ea)p6RWX+#Wl=t{lWxmPOzQ^fKf#d2#}+#@=&XJ)|xO(pg&XC zoIcj4AVgCaik|LG{n0%P=&BIT+9iR7v6jZEl`2T`uY@8+*0i#FT4%R4Ye6-&7l+`{|e#qT83L3BFrKRp7zjaETV{ftpjPM8@Ky?E)41P(MdFg#%jJLt#r4b|aY9j~;ZoxHOX1}+&^Fv)eiZ@mpg z662F;_ai&vv8N8ip4~eVUrI^SdHF2Ie)lSe1h({!5)g51oEi$AAw1C9oA$RlcZ-M!tKSF^B@1I%Lk(!6=K8z+wAa39CEjQSu(S_e34V!t1T|}v z8`f)6k0k5VWE=5WuX}9z zqhFd6bz z&nJ_8FMD(8-6eozANF3`qis-Kq4SROxZ|@SgzdX--sf2S)vtavd2!kfowIYBT)$sC zR_8J~x4PM`yhII9aTnc+ySx=$|~{ zUhnrh@v1bC>68)B+C`dW`Z`I<2zZYZv`l~#ug_(=de3@+`K~3e%rfnUhI4~OlyT@h zUq<1i6-Bj?0rM>`>a2Rfx85-Jy-O=dcnbOb>$~eG=qL z3Vi@ee1MZ>l&0z^U0}Ug?T&5~I~79Xl_^^f@2PFwOz0@WEi!Jz;O1Cnn~C0-z~g8F zaBB|h>t(#wwB*;jGJX2$_pc?x#bXaldEfbU5C82b9GiIf32)fN{<3jwSmc7| z|Ins*K9JM;%U5o&Jv<9W@CD=67@Z-RYpBC%XMhA z%Da`>8-lKmftQL`Eunw)|MD*hgwjLftH1Yq@uz?Kr!h7*mSm2#WioWxfB*0Q zJpoldtL&i?TtLe;G6b~rNKy%v&uJv)_o(pF+sjafD!$~wJ^tbsznJ70`D&lLwEq3- z%coqfwQ_*x+_Lq!yn9xs|Q0ez4Tgy5gdpL{7xAjq>2Z75B$&!)@ZLR&ck44_xoq zcjv#dD8ZegK%R5#kLsuFd+zOgp?qJ7ur^t`nH8bVlIVs3Yi(Slq# z%&5=gJo4VWJT{-4yl?GXDsLh9rmjsdGXXB=-duLe;r)W*mf!cST^G}PbDqv4Ir*LW z*_@Zxa{2Rp#lE1x-AaLi%eh-?rYP4Pp@0*KgSw!L6Ov&b3{j|%;DjauPP^ICrLr9yeO_Tlzv`wpP6+hSSMF4v7C&(Pl45mSOy_a=(IJMT{lpoB?H7VyU~JPpF>)B!jutVz|~Hy^DY zJhlKWLhF3Js$7F&c`sA+Nz)=GE`F)!LbVq{Zjv6tn?BB2@neH5a5*z zzW^5tvI}lC2>+wiz4;RE&e(Tp9T+?WlH#VKLbQxxFk(sIg@ZEt8Wz&sC^>6gFzI+0 z)%r)UX**3TD~)?lS9igJ zz(u3FXDNUZ10J!&n3#Znz;^L0K==? zSD%S9zxaO49eF2x_52K$%m4`Uc!M7P=%;ax&^gtS9e9d95bgf$gqMY%#^bh$$F1*e zK+lCUzha%mGYRYh*}_{C<^I4<-r%~6yu&55E)MT&2ObP0nw{Tuyj0taOY)q4b51ID zRDKEu>AfWw;;~7-bqSv9?3q(>p#_lDqz-w!+yunCaEx$^7#0om#)Tc*acX`n)qnEz zVb1JguIe#dFZoQNoc_TNf0!Z}=uM=ORp225RIc5jlFO9JmyVb|SNUJVlj*gkHmHttU|qWaTx(ZQ%CCCHr&jDA_&8-EzwZzK@DEeiJHb2wTV+&36DqT+VEwzl z`@2;Cp4-2FfAV6HHd(gHG%NPEj{=$Yf-Z&$vu|5hZbm;*2Vo!AgG5gYLybQ3%rmLZ zy!U=j>K4=+2xz$$lJpeN7s&G1P;Ao9O$EPzmvnS|&9uMYX;^&!l_?;9U^{WV{PREm z^NV5qoNwHm3)gNrC!g`Wa-Sj!g(xVqWb9n1AF%$sdlkHidk z3#MuOBB*N~junDjzRUT}(5LnX+juUUbF{zB%YKl(w(>XJ4Rd&=U9m4H@M%$?0JuIa zN*4Lt6BKZucT#XdQm_=<(lWv%Go=vh#G^2&;8;uySFd&_RfTey&eJF~R2(>|N?)%z zaXaBUse4YrOgcN6%Oq%->G{l1xHo0GyU)j0FUc*uDl;>SC_6rZP>Nu>TE@%0F{@Wp zewh4Cb7QS*)+-~l$vEG?$bJiq`0$`1gYb+1L|vMnjhW-eVsdsm4gzq!-T;K)JzwtG z6i;GN-G`SALD)Xl^`zX3KLrKWQ6M+GRTM&{M!Gt{!tR9FNdOlL9~D6{fFcM*%!*dVfUamG38%BFNagtw zAW2D!dw{ag>VJNk1=ME=y91DGc~stDAx&-x;4%c>3;>G#qnmtG2=$`;>FXY1y(ro| z&sFg-YoTn8|6{u3Qw$}Y!pht_Yyocd$7HiB#uuUQ{1S?~dU{5Hi)L|O(d<5H z8pUT`q(B}Vm}3F8R`AX+G+!q?A7dM1S8H(!fa{%T&Yg=MyqQd8&buBI5b|BpKPZ3l zs`}Wo>f$F}JWy$K@yBHj066fb?dluhn*3Mi7I~E_UN7Cfc*blSCBz@^0Q@_0<}hAa zggV`}JBD|SMGxLvb9kGaIC3aT05?6uNAMKe4BI z#vC)6*7~b%8jitU6*d@3bfM&hce-4v8}|*$4*)uq+A8w#TFTYPmCQG4Rh_M#0B+-fX3-!W&sheyG` z{_DTS%P+s28+!Z%x9HD zFz)^{WY3%l!A+clo|6C264I%<^PqSiX1dHIL2nP9BZFrz}4y>Ae3?~Mgh2%3CdUnd`TITPu}B(elpxJi+N;=Chv0R` z1g|+RIu6?Z9oMC!W7_qOf%iMD@8|E&{Zk{9wd+2vr^))cFOREvUUZ(ePit)8=KSqg zEJ$S=&ES^$E_s3sbY*bMwH2M)vUj$ID~2N!Fw+>{Hmy!l@cZ${A5Y`Eb3&d6EpKk` z?k$hoT92*u-&FiAD6r8fPyk#Ty#|Z&f2tI4(3d%KVtItcssG|H{vrWfT109^>4an$ z0VfqxW|VxcNFP%`8p<4KU7~O$bLlymPbYdOcPCdFPZnypTp=w`$HN&t00PHZWo%JFu(N_$a=Xy}}$)n8Oc$MJc)P=WcLhSFw5vVgMbgGvD)^S3h zr@pv^H&-bJ_B;~%zxs_B7#xbNyZ7Ot!uluugrX(%VgD2Vj!=dtS!ErR0000$07*na zRNiqifm%)G1X-OHh7`-Jbp^&Ak3IQR?BBmXcI|yIk?_M0-e;bu;_c8AquW>u3FZFE z6#y=ZlIFLaLtS{J$|J6}!qtf&10gC!xg5SPE2QLUP4dVpx4d6aLIs!S1j*#3vn99QTHpKL_tG=D`~qWwJH9W6#&3M#x8mt%J`YLD*aOw6hZ;sb@>_Zi zC_i)>bZ#@!Ud5=MKq~xgA0`$3Do$0>x_O+ztvgj`sbIyQi~T7Z%L-Q7$5meE`paap z-t619=L|So&(?3|;qtxr>OQx1+ply`!SC3oUdHiMU4wc9uSqLusiJ>uY%J*(q_gLx zSD~}HS6j)a|6RF%xxd_)d8PCDUavck3O?y!r7?oMhTxX^FoA97b=#}nhR$cUPsan3 z{oTC$?Rk%F>$Z9G{o2>QmcT9BdG_A=^r=wfSWsYNQJ?_0HdcKVrM<-zaN=+>%D{_O z5ef_nqE0|gNHU&BjvPsXr$UqW3c~nYkvbH}baY~N0?vY!uGCJ_0$9@2$z9qx>AN{W zYr&#m>f|lG6{@AZlfL&$Z}asY_bLFK)XnF%rCim@^avPBr_RLG%dbV_EFo^N*kn1H z1UM;#YBj6^-!-x_Okg<$yac5tP@289JR7f}_#emqw`2P)_|-|OI*hsxtcQXhdLnG^ zL!tH%mf;VeCWul}OZ66t6ha4jiIYt{da8KpR0+jY zWj%RN7K@;x(Pd-(Ekk&Tl95Vi8cQgI61asWe|upz zS~HW;m>7@x#3cE!&V&jg6v6EQ)?FdLWjfF_;M5sB%9gR}x9@ZVy!8NZ)v&Jat(0P} zw~7+9D;6mGG)kuncx;`WU1A-nrI^%%3k&Lcoqoaf>q*yl*Y)JI@$T{4o6uyfqGz7Q z0HqB$ztUKU#)T8HboN8${C64LnBkd^Q^-~B>>ha_Dnr{7@YTkPtK%)jJ=|v>xp$Hs zzSHS1ewI8BV|CND`DPg~FhuBP9lveQU|GLoS8Un2JNg+*N_b>#-S%iy_RmG_S0BXq zA*_(cPvAW~#fSqyu{0me@ni6JgxopsNc<+D)(-4{AQtAPV`cUfwmyw`?tyCT+FgT} zMA^^ybGeku#gq|My|`9y%IC9!Q^m2Nt6bA+EkNS!j(dxM_za8D4Y+Ut-oL9cm%d?o z3UB-Kr(*K>!8kpL=MY9nE38S_1;clUFht*Ct*sn#TgBGz{od~-z)4EYETJKw5mMjaIhwoeq z#^rm>GjI9a?c7_B+4JQ}@6Fciv$Jz?;?(IlH-TY|@&gsSjW+irAlGxo73eUX)kGo#BV!e-i_xAMC)~m5? zOLtU>>~IQRMo+Lkdme~^(QSnH+#VNZ=kek?A9W1m#sNo9|LR0E-#wVxv&MXrxF9Zf zv-TJA&kCULgAeVGz55=B9t@0>DY7@>+B&tqY|qM2%1_ppn{sMi^CbgZ(rWFqSE5~U z{?<_-k3rU#z)S9@%DEZfat!dg;Ea7(LtERf=LLF{d+%ibyLHt0^_=}?zg2HdfdGNP zH{N(7(L{ZM?O%F$-OX{!aIl6i)Oc1sLC)jXb1%*m6u3ME@;G|=tJindwyB|s{aC$~ zdN2*WbBICvyPNIWes249UUTzac?LK8yu5&$Ix%&W&p-csGRQYy+qdQQ-XawgxSuI- z8#TiBGntET--r~D`IO<5xzzenM#)8}os`@gc2B0sxb^}#PApDh_j{57Rrq!y{_>Z< zoD>HNYzkS@)X7@9YH4NYl_P+KZ@>L^3J3Y!?|wH~((2VEGoYo5fR@kcIp)uxp~6sE9H9mS+gPJ{Rs=jyDp)IGI;rxqc0Mh8$< z4n%dZl0KiaA;_8J080}&kE3{T;%`HO`woqg?5a5?l zGSw$$cpq!^F&>l{7s@DmC<#DIDb4|I9U7k}3?88p$)*Otr3Y6B=<15W8lkH=S4SZ= z2hcJFz;zyg>+FR^94VJk9MLl_D&MYyE?L)@_t){ry>N>(5(KQHgqs1xI#r%ew41|= zYox!MkdT$M&X!(rf?sne1!rg*vw&Pa({e2wbn7H=J&eJ` z4uCNLm@>f4%s5_M=NL*Z;IRUaL&(DcyrtSpZ9>&Dt&m4=wS;j)33DJU@m=@tD(UK1 zE$_zwjeKVQowEe@AVeYa57SzsyTrPLJ!uXaKSy+e6UUPm*{d(V6mx(lb900)L?NZJ zRppbQg5Flj3Ca=jz4E`lC%-Gd$GyC3mLW19Yk54D|I5#rk9@EST*DIi9*xFKf;sZe z8jPv%%3dDn;!Xa^?KkglGMiiWSfo0f7!4Jsywm+!D)x zT!OQ0z^iG(6;9*LF26p4@l6BIEF=qfkrsSLGa27BXpD^k40&iAEAZhfiPxe1z>&kS z$7T$7c0Rm4c6|1c*!zW*IDCF8{^sxg2W!psMDOMuQDgh+|MOP>URwbVd*b}bqjBuL z*W=I|cy+z=M$C+#iI;!;gB1N?bn}+@lmF}gj;%X(#vpPOP4SYHm6^7Q9JD5nKOKin@&vYNfmg?4H^*t)sAIav?){zHt>Z-2b;)O_TT@?V zKBjzM`ceETC~zNBpa8h;vO)T2r_$QilT4MM28A;(0Q60#^9;ytLB7P>|5r@LIEKnI@C&q%I>W124@5v!uIq z;$9}e`%bf_m)0*@yE&=ny1X5A;Q9((Xx$eV7URUp6LAz_^p)m9OrUa6;W9(mwi!g? zB{aVk;{89|)sC5VIcOz>TPvmWw4ON3qU>iBouS8WLhn4=vnf8u8b*3$8FtX5msd{t z$i1SpVa42vR8Zh%C}7h`-diYcT!*WT<#GyD2!PR5r7xmjtl7JTyG{^ zm!co_A^;a1oV6ziQOF|fZPw#zt8fJ1Y720o6tbn3nsu~;_$DsS0dUPk{Q~RNj8CC7 zRygg7o}G))%b+2wULnU&~vgzeDgTi#0vd#d) zEbwdt&?~LKmAZ$2uCD65M5lkBbSdlKs9JhnG*Ir%0}QrM@Tq*BBMjkSPdAEPECQ*M zX+l5Fp_yK$jVy8RB6MC>Nv)g1eL}CB>0=w_nbZO7BUGjhBkfm9pSliz*50%J!%`c# z#~Okt4Rd&X;%F=!eKmb?_wb(R+5T7pxYD{%bLXQqKbe3o$Hp>-EZw6IMEBI_$033 z4FhTjPzW%%d;#xYc%v2OnY0Np$g_hVxKTCkubFJlSGg(k`k7B%f2*%3^HNy4=;F^X zYflolTqkQw7;z>$dH&dF!^=w`W%j5+y?5yo*kd zWhCpyh!=u+)|p8;OPNdKLSOMz^SX5R#abxctf zR-tVh)?-t-+3`TY#(r;|TF=&LuGc&EA-C|w(#P+V4jRV3^wLWgBf5Cab}p#zc$g!@ zsJGDoK(AK81nGRGasCz-y~w(tz$No?o{#LWwoBKdw+-h_a(TRVpN}20-MsEtVS6?| z$NyqHPb4e;6ck7lC^Yg#L%1&}kSB!92xfuN-%b=)Vtl;jvjQr{H~;8${6^0$+*dnaS*?d0yd0(q?f1#$2383i&e4-LKI zdF#n@&p!KXy2tv{TFd)gG+Bj07QTJQtxi?S(@PkVQzuTw&tH5oJ|ZN|;hBkG1)+EZ z<^D6QTQiF1)+n6^YX{*5A0zhvBY1A@Ow(NR!IYIT|#@0EHMk+~@jRSW?f=;q5RJ z^CvIF?C}dc&VucGwne$lJ&Xwr`p**gFY?~G#X7?3LIP6k)>S~|Zj?t=<4##fl0dV4 zegS}Pk*zLRhX+9m1(1qV6|VW-^uW45Yph(Uji!@k6Uw z+)Pd%XL4gley{81GytzWcE5;s*35-v=#0my?SW)C!UpuTY=T;Ke?x1*F&<3!6o0Nn z0qS|RKXhnyH_;2hnt4>$n34bkHQZ*dYGatOLik)$*)Ux6OV^r8UYU#81qa zC}iJD?V;25n+p@s0?6un@JliH$n$t;?M$@rTiwdt{eUut6T{jTkL)t@xt?5UY>*!J zK}tgaV=W_YXFTw@jY1N@fMFew2wJIx0mw@0g>suia~s2-HXbl-uCLSq*x{F$bhy{h z)P(4P|C3+5gtxZ)3~j{lEH5)1Gf{dj9VRPT@HwhzTT zp^{s8AvUWVH~Zrh25pC?>V!b9$9#V!4s7j_X(YM^1_`-LNauk%VF>%8 zGCC67J9fv;%?IMyfqgMGd>~%?`OEPD7eVO0t6#hn@BZuuapIS+MGxVfdq%d$z`kdq zw(GGN`NHOSWcPD~aXu4E=a0nkH-8q*`KkDazx|td`;FHCPIpoN$Vaq2E&u=1fBH{J zE_(01_u`ko{AD^;$**UN-afWJ+oGHI+itR~bYC`tyY!=NoA!TYS|gX(#|5+mbKDLc zI+TDeK`_IqTA$zg*0ibpxJP7vLBxkR{;f z7;4hHvJ&_ICjN@MUwrcqJ$jZcBx#@*++I`93uwa58u^SzGa8Q9AC z&JL4o_70tLYJ30uJ0!DsDp&Q@l{^Lg*_h!P(tT}`)@~;IL1t84D+@J3@5S;Hbx!;Wh1ViVF4Tu9+=!Z)`l`}vDTcK565R4%kqQdj zG76;TMJrR$XgELG?+Vt(d92htUVy6vfYigy(?fei9c4JDXR?m0N+@8Pb z{kg)Z$5lY9v(6Nuj#z8Tb7^p}M3lL#cM?FhYfh!aIYaneOn}-Ykqq~1&tJS@10Ez2 z@dvO)z@-CR4JRP0F?~7#fz7$`Xf8~4KF+Z~ppbP4%dSPp*e3vXzogW}9hVsl9Jf}W z%L<;mU98<$VZ9t*B+St_IjP4pJf7*2jvK2bSAo_1}@e58D=vV-@UxA*2S zMS@#iS4L66og+rb>*h6Wvtl>%)N9{yJCFSy>-%m`(#f)>HGcsE_Td$^8%6p2$Z)A-WwHSC>WfF3^rAj(gk-w5?}x3{NHyL|S2>qR|79!m`0Z`2s0oH&j+ zwpfRb6-GaC>@X~!^?WZS>0mpzze*RuEWcUZfX9xv(jiCL@mTtJkMt1q(=*0A@>qN? z(Wm&9jZXpFcrgxd{CX_D;O?YA0dReSdU4`)@>Jl+6S3#kZw_EizWKgS@XF%Ro1}nN zYYL27xg9%pEG;@ZHa3>R;u+RKiyys-OqUZDty7sK1x^_&Ev!uc@DKlxgbFR^_V3@H zm@Dhq`-`Lw<72Co^%J?j-7>v1%{-^zu8^jsnn|UBAqy4Iq_59dr{3pt>+`-NR1o2A%CNS+NfGf>Ry<`r3VEJ3ZW88N<&GpfCcMlu_Yx^2PC4SM#=j)zk>Hx17%$urC#v|Znk5Wgld(6JP=Znx3+q_i1n_DS60za?IjaIP zfi3yt_%846{K+RTzjwG!VMhsj7+r=tP_2q5Q=4Pe)#)171%F@xJaPGq zuW{C=B)^_!mf!Gzf=0SFc&>>Tn|pt!Z@ET(H+$JKNK@BCyO=y=OKXdG(witnGEd;p zpPezhbDy^q=`s|ceG87X=^wTeJ$=f6!+NvOxuBtYX?vTJ?V6BV34{`$27u5zX?fys zES-9X@S!I-w?ttmEAy9SUa1r2jF6*U{e)2BoFJE8OI>(v>eFm&&wn{wGv|>s3+j7 zMu!rwRguSIoW0Y@vCeT{o>L{Wo)UsxDpkEEKbqw{WsT0**x_;4m)(2aj^H))A`t+T zE6hu;48b!~R@R!A=jA&MiFgv8Q)RZiu{^SdUY5)8`%a`R`})0isth;s-IlY7r=@l@ zRYOT`-Wvbg=#F@Dct;$BS2$0Xi_uM#5g?f?1h=>4~sqZfcG2Dij)&z4y18HttZ zU@Yy~5sQ0!W0tlszA_y{80}P>4MHi?PHeB#m!ZeoFbI18E#jRxhoMe;Xip43_4QaN zZ;81huSI?OER$>_E_?`xHGVky_kJ#hA9^zy8qh8S+#|=Ro!ArM14&;1peTi?~8~hgAs$;5#t^&BO zFXypI8hPF1_c{)`#-7{${rl5zuO+^Am9G9SQbB=&0tE#M3f%h?C;+aTsACy=lT4z* zhnrR-3M8I$Le2X;3CnD%6!%^Qm<)`0-Q)zl5rl(O*bVYW2Fc`Jq0~B(**CVev`!!e z43id^T1#p5vz{@`zumiONhHIipx|?Fz4cbItTa#aGlWQP9~*>Bx4f8{hL?L$Zu4se zF6rksJUpBPd6`(l3@EgDKG$omlgs6MtIqj;6%Bgyxn|huGp7+|iGxp!{6|shi~(>B z(x(Nq^u*eZBGavglFV>~wn%}j1+KY1m*>2OnzL9->sD1-k?%DrK$A=gAC;0F5!=67 zJ~A%>xai^4WSxq}8~_*NT+B>G8?egogdi|cTH@F>R#3QV%10KmpbX1;}r{bp_xsc`ryyKkXJK%i&A% zYg{iU)lY)-I@i+mbi+-4ui4yhiN4Touy*A6!wF2P4)0Fk>pB1vVgCe(xTljc_16%| zy8pD2@3GI!<23?M)3$xlKO0jgDc_-3I`dvSHq@Red28|dwjoAI0u)_<6&2P^Ne`JaGU=KQu!U$nd@%pjntZB^~{-biEhi|A3;vWKvER| zr#iGfsw2D8I$X)?Yoin3hUx7n=$yft5CB!nlP40$)de`%n4P4};H7Sxfu;_8dI_#z z)X2=8~(P=1M+`au1n*--$Kg#s64H5 z-sO__JBO&4HZp<6cFH8mhbpa=4YPch@AZCpVBc%x2>DLW$rH;Xd*98Zwa;CRN6&fZ zdwecG>psi9nJ)R7zkSBN<#o$6%6Z<*e(n47^EaBWh9qflqHO)WeerPbVC-cb(LM0- zhj2_kSZT#6n&K>^oq{j9u&_j^!pT_fWxc&#yg~r*Cl=4e2j%HlKHM9F&6(J?I1vxb zj7OiI?lePd>F5>sodE=1xDaQKGna7FyYIY{+KX+;P?okM_j+szYPq*93Z7~t zsMn#gux&KgXQpAXzk4WP8@JC3UI}jHe&iTo=zhlxllA-g&woDEwf8x$sOQ+IDfex^ zQ6OI$IK~-j^BvmyFMjchq;Ii3yS|qC7HOc-vB%Fn_gvbtzUM~Ag^fzLqTB@q3JMey zC@63#1z_QdbiEYFOojr8#{wFV zCN#UJX93}Q%T?U>>lDZWRo>^g)ZVGb)<6IAKPR9{+UvRX#V>v_)rZ%u3+uo-RuFJg zh|9<3DdVNr*B}1jAExjDh7hnF_*00rppuioW0L|}`7HGrdj7pRhJ*8Neseva|V}1cEVib{6D0-$*xZst=A}g%NMTo8` zERit)D5*TM{o7CVTv;RxEcZ7JF)}@a2iOw%2~3f{;2C+h=1?3@W1T#8j>X>xV>@e1 z)JOGt2Iv~>iE}ecadvts&d)8!4CR<-YnSi})3eF(IeB(j=2Y-Yzs1v6Na>p`D;C$T zKUQIVF9EeGp&4t08LF`cRSnRquf`gHtH0AaV4U-Ojc00jeRVM|FhHfZUqZ(#yw}r~ z)W;0m)5?+_jl6Tv-#Y*_Hxaf z@7Eh>6BszO>Stp1gYQQjkgIq1XQH<4;pFL4!7HFLuq{e>{i^V%(jn9udh^@a;n&XJ zFgd9=8k?SDEdZ^>lW)c1i8ttvX8@O{=!1A!a!Xh5FrGI1lUI$vLt2YV@66RCz*Anq zQ)_TrD(~|6LHc+zd3JT7AU2Z(+;Mcf=H*{lT5F#dVDEl6Ra>-Qx~^p0CdB+WmT2&2#zs z<%+4|RsQkl(WCMG?|(n>xq4!$nAS5vc~aR?{!*S-FAf#Ff)*Oo>A_*RLPMCXegFD$ zT<+cL?^lk=AXJubt|uR#6X47DT6W8(tgD>0HuzO^QsdZpy41MOQSlYZj-aWe* zZyq@puYYhTPM$u)czG=5KU$050-SH(iRto#H>HYWLkH7hw zze(TeSm$>cmM|y1wFGO`59qPz*yA}3l}&jpxYBr#^C|WP1quoj6euWgZ&Ki*{`KDc zyifP5Wa?!S6)9fPuUrO6CNeWe9xE7RFj67S z`tpA7k?AsD+lBA+cfnA7@^+SKD6KP?Y@f*IKlvMOEC=gbwN1OxOnv1v#vU5@jB zT`jzx8m`TCd1LuhhHL$yYpZ`^-0ygAb>pQ~#gnVA7eK488&HdVcZG0?cxLui({V4L zRxbcp4_hw)SdYM%V6~l^bUnR!_0}{HKwikU5>t4n4fa){S5GlewiW}1pklL*63@(` zWsx=*1*o=C@|vO_;W5=D3|sxe@$?afWvdKs1yI`8@#ykCy`kVc1Q+c;AOH!JO6R$r zS^(|9_LJM&)hV*t(ri9}H4VV5#)V_CaP(CGt~b*;UYOolDr-d2nU(ai5qwBt71zDM zd%8#WrUD3D2!aWCb@ju);@Kde$HjF|ZP1^1yZJ4Zfz5bl0qQ}Q=InSZpZgFxo&a=# zx9r)JJiKaK4Xjv}9 zXIBZU*S9%&x*4*wg2z^MXeWEXUI4BY!adhEVOTIMKvKo%KyM(+ba#w_nHSCbYf&rl zkkCl^PkB)#wK8CqCzK(SHIzY=DcrJAmvW2Gx%Yi4vsLb@)XnnawchV_p1SQ5{=S=MN9g0*Hx0zjeY;}Q7oLvT|43{- zg@^gO$Kyo38sl|Bq|Z%736J#(1}IDLG_JurdzLW9OL$O?4CCpA5x~Nh=p#=9PFC>J z^?Mx0TZ{`$LK&`G^zjel$Xh>;%>zBLviE@) z+p&fEXFcKvc981MJP`#P-g;2T@>mNf>mVoZ_u4=H<3FZ)O+pA4%|pvWg~|Oe zP)|PjWC~%Z5M}b2ci(+Ct-+;`r!X-#HkKH#jmTK0kGjkLNJs0zbf;*V+gOP(Xe$WR zN8bM+{?~WE6YqTReoRvDIrSnGKUnRFohW#i4pSJyRPKDky8Ydurde00;%7mDbri7Q zb=KfQDYFLPYFwB`dAWen9)Jtw&)) ze}T1|MiVH~oEwh@>s<*7R5$O7Dgcq|JP8mP#*G!NqQTr(t_>y6p|sW&3R0o16~YI0 z;W1D(G$!P@YO7e&DD}u%IQmKl+&cMo0qjLarhhS+$9Z*GLXc&vs=Xdd7Y`1|N7T1{)^`cX%v*`STazy%&ENpZV<5 z@#WwCa`Zp{?_%4~SgIAno%^gt5r){e4y1wg=Q?d3n*=4L)s<+FZYuuVwG^=JyE$&y zFVs2Me{AQ1KGwH=&HA^VZTsH8(UN61>9O`_fA(i->~s8EoBVEpbjK3=rDKS6$nCpm z<7=r^92XQQC~&hBa9nlFb<8n2re@y4aprP-(#^iBc<$4uKml;w08O1hWh{RA%U>pN zL$9oCO{ZmzK$ilCjb4UQhC>EZYZIAwJBpTU#!xqTU54IgoTQ6%eH6%pihCJ3!7TR< zJPtq}3u@^(=cYg;-4)&(s1y>d3peY)lr5mFWAk;dpkzJ{WajI!_3W`8U6+s*|a=G`gAC8N14@*)XA(yIKuN2aqOdm@%n48#;@LZGv-*}d25YuEN)zXwAL3} zQPA|!kC$mL_kwEg)2YECmkmn+b&6~&fGc`SC4h?%dUe7@E%mbY1mOx>C?j1ua9pCwp1Pgz$ikGUNUyAu`|Sm~V)}9>J{sQj84N zVsn3YXTy_gL~skQu1$bi14L2j#bdKtZbfZnDJ?9&>RWTer4Zn2p&V{h`v_@N#S;um zZE~3=M%U~-a|t06=hGTrH=K3xz+FKBI}kht#t*K$A|TYlI=?=7ls-cUH@vE<%oi&8 z=}7bm!cU=Ot>Hz8{uKU%UexZ6(#mplwR@twrwTFu`s6se6J!fj0#}e33rhIyf3BWa`P9>1S@S!Hb3q5QEb}V1d zj>kJ5H-;%xy=q_WBitPKb;9!ToZoaWCFz(y3E-~^NYlOLLB5^u_k!02!KlNuzn8xK zD&LaA2DX?307qM_p=BG87E5P8Ol?ggfWggMSxaks^o{NY+}a%#LOmLmQ_$Ata}hj* zj!DT+e*x={ZG-fInhN|(_^TA;F2Cgb;--9{ETWQH`9nF;s1h1SDnBYKdQJI5nM7|T zj}3e7bwQjj5SmWeQ<*Z$CRh7>-(&vDEy_a5u%^70k1~-SVZO&>Wzn^Kx4+#q=+rnf zuZ8m=>ld4!-(*>`a$PygvZpx}g}dI--QBe$PbnLjkL9;q=9?As{?_Lu(ywsH3YKWo8n+rvgkmecRFAG@BG{o6k8IAa^P9ea=M z+Hu73A-84kEmA>&f&v8vJ}nB!bI6m(D>=?Mr^<)PPdWZ>lyUXbqQ^$drvSLFqsDB= znUS`!JK-vD{K=pENj&@PvndCedxZlT4%c@&bm&m(5HcQG>Iq~i%*cS)Ib^=I*3%MC zYZZYq^Kim0(v>OTAme78$nYpIDF|6FGCT@9(%3CqDSA$z(M5Nqw`*rv2QrD~Wj@xg z`}{i#Q%8;*N%{Zur$0^al6jQb^j)r{X5AVlU~FtG6q(rgyOQ(kAP)p&}I&xK}9Pn5Yu7 z#Trq~B|WWJI|4P#0$xjtON8THTn+)PrAgMDJbNLQP~K#KD=BXvL~~&|mZmU5U~Q=u zO8Ledp=0MUNMIeV_G*~ICV) zbjK6`*SV=$Tma;%8>XM z8mzRVzto8CHsN3zD4b>q%{ViOUhLy_if*J3B@}9Uy>xBf6G6zX6_iwqgd;jXSdYo+ z?l`Nr8f7#2w-{X#DK^v}J-Af-+lDKI@v|ab=PFGVfFc8rd?k5lweYZNF0o$S(n1Um zwBw1Lgl8)^;A76hQ=9_e>W&@5yJN?`196B@oi83*!t<{c-JRyK+TA+*k)g1B!3urI zaB=m?V*n0kl9x@No@9W=rAki%C6)mrQW99({s^9AgUQoNP|Q>&+}7~t{!f6d#}ZH` zSZAAEA*7b~rbNT+02Q{-d%Tr8CIU>NZ=K)QJxTx5oA(s(SXu5x|Ai9QIs=`5TWei zJ<2l5ispB%ThKkuPY}RWn|BuJ@NSCk0;sIGUa3$++5%3 zumAe5Q@J(pQwg0zr1?#jtEp^+yrn`YgHw8Z8D>mS%5VPJ&wiH5t~~5_n2++YG!leS zdF}i1nmazLyk(i}V_uV98Wc(c0kI$d_{Z_x?|wIVi3tM!?(hC?0s@r3&C@)5-$jte zMrPvs%Yy?^`QqoJ>)|mP-U?$IaySMplS6$m2Pjp#fCqYcJi40Yc)YtFyGQjXBl1c& z-kcMJXN^Vz9>;d?ir+kWB0hNUeImTP5kEP4Dt>z6baeN>5JOwG$H)(_@Z(0X_yPMyKil2Y&7^v;UtE@kE^;hEUEt_c<@5WDm{6oSQ&d22WbMZT0 z{&GA9m?b@=jdHGZQZ_bE>8`HAq&zF|n8v7druef_C}5r0ZUwBq^rbJQ@!;S7?cY*# zpznR}dkJtB46+XiIy=UE?Q364d+R;xBQ`?aTShm>1r^DzjqVy;8inh%`HNrtB7OIJ z@4c7CHFa)TceZxS+9-8fl(V2fL4muA0?wT#=VN)1pa1;l;W%q@EYiS8y}x5mp|4M5 zxoiL2H2_y`RBI`f&*lBvYk4AEKWTffTLwTf)42B88$EWil{pl=(t6E_G{^rHq>^#= zx{cjydJV~(+Zhx}yvICb@V#!?oRnosw6@YJ$1*G2$c$X>dvCPN_sadbE;CK6Z)qf; zB|Q}a-4v)4)T{%qE4(=XDLg3@D(FaO>*Jw^9!kuh_n2}U%J0a+hIwio<$W@WraYj@ zOxgyXe){PoNcmf^%{+2`>4Dhib#IlaOhH zC=vId%z2QoJQ>{TSYd9+Pc8~wP~g`nz;K(am0PS4)c{n&I3H~Z9#ouPP(5nk;|1#c6ZJuAL za~%({+QNMF@VguEX=rc<0M}qlVO2fE{XMQ#rS?-7mZSmoy&dNC;`^`T0FfF1LMwCD ze5nCs>9M8v7W=dba1k02U2F6KY}FcbQN~-LJ;yp3XPDE^okrQ;v9P_4*Ijapz*vbj z$GT8pbZ=Y1V{K;)W7)0u*f3iUR^b)Cu|fGRQuXFO^OE-#KW-xh>_p5bWkT3>!r2+Z zk8qoKbhYa99c4eoF~nc6HqlCDJ~k1d?7-fh*xZd#)bu0(E_@9FS5I{|x@V6@dm5l% zN$&*mB5bChQd;{?MX6p0w5#N~1!$&cjq7BUyHSkex#d;{+*-jKpv5{e?Z#p!yq+El zcyLt#(M)=onNQEo$D()lXQQ^`(UfP(S45e9pMVN)_8ZgS;E($t@vX^Q?LPR_%Y9-p z{-I5`0bpqqfLyG(HGc4tTidkvs^j)RU+mwrJsy8_A8Qd|1cbbl+KO%F3Mmb74CPD* zfBk=Oz)mS34znRfgf(KJ}McKf#Nap>@&6c+Ks@e=?rGu5izXhVQ;yHi>HHtFRzxL3Xw95n2sa+^ktgDA=c-lU!PoBzdR z(_+r=!ZWLl7grj`7)!mQg)FzoIE}k3<2A-CG`+3-9PP6%IaMN5>>}ae@TS_lc}tA& zo~_86z5RrGP2+41=ypA)jJ*KY3 zZ*c5$taPlhpF6G;aC zN;%=mWV^|1XwmkKZ+zooN01>g$!ugxy#4$4r{4l(Ij#NveC~eRucd*sl=*k>c?TKm z!u7ATMwE&3nr*^*S9r^Un-+dh&nh^mktPaeVmNFJc6tc5nBlcoxgcZmyq0X}E-< zOP#-Its16trubV>V1rVCVXQNhsW_*N14e;s5u%Ja7tgD%WvrW6f6LH<4f??Rnc0|W z5^{-qn|TaOLm>tUJ`1?jB<|FT9$SVcBp>tCJFH1KpXFJ557!9&(&-i0Q$2jy8G9$fvb{o-0! zgMdqefCnm=2JqY(hurI&rTNbHr7ydY&%2HSU6Q9|O3!FT-btO`*O5_i%T*`< zU1{r7IPDo=2;+$E(Y+~5;lh!ZlSfqF-p@yA08joZ3aYJDlseVeKVs-YydLRmGc&W{ z8a}VR^g8aJtnn%@5gc-#1 zSb%Ej%zIIvIF_z=^$|jQ>q9B*pumOC)Cj*P0A`tXz~8H<_SW9#ihJyvnbC{^x%lPXW4_k8)6w zf0zRu8+_;HQM{2kc0EoF3qMo;EZMb_SJ4YE{4|y4;K7fuO)13}@J@Re4?oMIH`dQz zei=`c58^xkm&)z`_?Q1N8HxJMt~DiZ-c4w}9*oSKr0N*M2pCRIP9$LKg%@6kZ-4vS z@lW6UCqS@=k|F66k3W&h(bH2#j+?ubew2ZarX4fZu1U5~SPzSRal8|2O?a#4Q-Z(2 zsAqmj^}AuOR64jvaTB8kW&^tp3jS z?HDQep3Cpr_Ks`zd+)iN9`H_mlED|iQc$sM-Xr*-3$<~)k`{&1UPjNlww?tLvyiBu;5BJ2 z-EA9gxs6?mV%CkqoB5fy&nn=#x9xe|WH~MG&9t#=m7%zP`zc_3nrw?x)b|I655>gE zQ}Jb#I8U(#${s>AEn+2q4(U4E!})~U^{H*ly+{QGHUI@^(0Ww42ABI1YySvXEdg>Z z;l-gh7HT)vomhyu26LHnIAdW>9tx28yx^4{TilTH^4L5bHwC~rK&cM61!%TBwGb87 zysAxLg^W_Pj8$}X(>AQ5M+p;HPT>N32_;lvs{#PE8;tLQX5@Dkd>} zRRFnadhrTqIiD6L2bl&}^@SY-zRYF2oL4k^4H#uHenx_2_YLhU6 z?L`1xj3`Q5w?rS_io?Trkc)9){hx)bO{dRAxBYHm621t4q24i`YPaB#ljjy59(q`j z3@0e~P#GjVBAXys6X2`0G)tudRO8K6#cQzQM&IgqCAHJNDwCbn1iZ{oFR;`=QqK8L z(K0e6?u$LZmZ`OX_v$Rx^R^}0VPpDqI-k~Z<7lPSjWZ(aMs3-ZyjlkO2y1EZHQHSH zI>4=qyi{slAGfh~LLAboHryZkdY1o`O`dw{sU)W=qk3LhMp;F#BbB)VL&_h@8S(ppbQn#ZEUa}2P5sU^ z{zB8#tepIES|vfIMZVH${oLdM_jsH4Gy%DMyhOeOwM_t1t})iBQx#)+b}5_IlFp(x zCRwLz8Nf<25}#`_woaTMM;EXd7becf89d&OY#PS<%sF5r0fp9~AmltUao1{D{f=CZ zmweB5mR~?yPmfx=Tsrnc7Kk9}Akfnv!Hp;i%tu!ynRZyUyKxa;OJW=Kv8yib}lVO}4 zPt^g-2i*uSR?zg$P~f%$TuwlF((;ot)2?MkcCmLd^Sl$9lUJU^Jm*9vgROv|^_W6{ zlbxW26TJY4;D=UehNAoW*T0@TdYmk8bn;tURvWuXAVp@uu!A=K%y3v%;~$IcDxlaY ze5U}7<+6OajGp%!J?}g2=j8WGTib-2G|BbvZ-t##UU?;fmeR=qMj^;+*1w@UjE8EQ z$aP_UGX8>6Zsuo_?rZny$5sBApU+rt8DKMC^S9i2fb;l%ug9y9al>7*z8z~EkEReP zXBQVxa7R4bGZ2pwc4r>T)G6D>MYV6|XjLZOaNk=LxS+t*D4?^3*4PQ)YN7BhG1mh6 zG#Xe=qS$Ex(kxH27<|1Fb@~N%+`pDx0taQA*T$J8Wg#t$1 zgRDtO7|;sqWOR>ikMh7UYhYn?0H`%g2*E)>pw=>LfRX1CO8<)>7a9Ai5_^i&dGD{4 z$`hTjo4-kC)lFG?m|OZm6$UY()^n>L&#hV=Kmc&7HF+lL=T5~EfcN~-(|}u(F@3_d zlMHI)T%O))#@9$4e#97Dy%>L22hT+phB1BHPZFkRAcm`(W0X*Z0$jap%l&wIQ6_2g zX(d??>0hS~n}Cj5)0@4(V+tL~xt3rgztu_mWkvdQC{XH>j~GhcQF>O@&mW5U!!O11 z0wC(Zu2|}SjIe}*(P+VAG8YL7^uTW(c=R#Wa@iZ@w~ocpmp_Vy@k4|(q~+mFQ?Aw$ za8|Ov3~a_*Yk;kv^L>C^LkUD%I{nL7o;X7PfLm?GWR6wvd~aGUkX<1zE@w>qFKo_+$f3>v9Dcl8cOtABg+ZP^T9(mu(CFciaAFt1#Sf4?*?Z(?U$!!>>q`|^5 z1OC92s!HUj^FMiC>Bag0MxR>^IS4IG%I`J2vD{nl+jeZnkfkr4fBvh+{O3QP z04$BG4GX$HY3yy-LiJL%LEDRC%*~7?>+`-Hzw>w~xT}I$!*z9Pe!q%l^+A54W0&Ka zG?6|Q$ek7ekcfW4+AO5Qv#b8X|&{aOnSCvF+z3>cY*;TYU}x9`!T z>Uxsp%w_fcmc>o0DdTWjM&ECFe2?GcCevWq1Y`U@K{pvtJAmKdcV~veeg5rnK7T#s zyO-|Cbhh4PUSwLNh4iw{-23|&Ouuz0U9(_jeHx2eVZqq%#zS>5%EF5DUBBHd?bg?k z^=-=amiK;7kv1*`tUvp!ef@(EK1fWn?dce8Qz?4K$Y|{7?u}s-JWG0>AmCOU*V0wS z4gPf`?u|=>qU4vSfHiCTaIXhVN4JqwEUU+tf9{?*>&Nopw)Zw*M@e9c-{4$WY|{@o zr)QDj2OET6Yj7hfqmMsbqODE-Hm^0e_?w*6PzCF?r|Wq*U1=~6Phc@MfycmwiRhW1 zivFSg*gn`Fdq?|XlC`|X0itH`_L}E-X-UNrWkKPllF1NBZSu(D^xC52V~e7Nc~8~Q zgoFlU&8>9>fl|0>K0)^d|f`@tvLjAD=3Y3JN$6 zD$`ZE6PTq(px#`iGTyd301og<)Dy7Tvo(4~w#Ufsy#Nk7@et~!9Xrl<+VqVOa&3=u z%-YDwzN~Db$CNUxGHR9w{jMyx$a`ja=7#2#%MeH2#rG)7s_a%?73dOJ(HK;@)kq^* z0iNHRv-16J{TP`jcPR(|_(wltzFmx`Klf~mY}Q+;>Oh6T3tnd4zxptTYZBh3l%)db zK7@B)7X~aQy`S_PEn&z}ssY9`jtvY|V(&wb#LitiV}>=bW)?d}ifb~vIA#IH1dk>zOeHXH5o5KpXHO@us6p-m@>sR(mlpbx_gv}6 z+Rx1N%J=%s>L`>^l^?AOH}6x6wQW6I@O+s^WH#eQQ_z&cL+0BvFa{{8W#FMTQ1v!PGbO|4C~A=^OKRk_bP zHqYOU$#1iq_63*yFa+boc&f^&{}2l-TFOuBaMqP6%;5aaAgWO205QP z=gO-Y=GFOH&`Vvk*Gimct)szh7*>`sHzTdl}BTWz;2)*Avsk|D|O_0?#T-g@$o_MYVp>)ZO2-Y&}2p3^*}8hqY! zawF}nmlWDNoc7=8`K_F@`n(nD-M!!1R_$*DvcLP???#^VUM~Zg0-D2p!=X5iy>CpZ zDU9b)1UnMo5e4*jZ}GC6Z2$!n7g+C}Tc(mO3UW3e`nxxZwl%QpVQCOe`Y^P`^|8-6 zR!^;asWjfa-Vh^gy&U6Z>%RSM6CWE5glP@Nik11<(1XUyu7R%b2q>HQ!)JXRVH6Fr zSpcqi%p1ZUd05oc&=nLa>$WW|IZ?$r*dBWbVav1C>hhdH_-I%8>htSo) zCkZCx0{(}ZvjALEm=+qJ3e~CkP+dR^8xY7mI?k-(5!YMV7FdW+vK4o~TXs%40FL7F zeCS!Jgl+f%JG6r_j=ap#@6-SjH&B5q&QIL6zFY%Dgig~4180}mV8ZVT=`G*~jUKNB zVlu|wZ^8Z_Rj0`08l#P^{YLn?onXWz2+*v;Hy4iKd+Rd*EqrDHco_uJihxe}-d&+l z>J0@ztR!%?!x2`GKr*H>nHJ%9t2=aTKODMy8=(szHUe?Pv36$Hzd`eYnvtuVdM#>h zmC@SL-&Uz_dj!GM$ccG~4K99?{mCeBWeV8W!Dsq(>wEZ{GFX`V_@`(B?hXBqemnY= zQ){rgf@xKN`yzlt!8VkIH450TxMo=|i1vl{^-BBiwU2M&hv_M(aUJ!eAN?qD zmMgKJoM&#(zjasG{Xm_*Za7SzKOH76oC%*CI~sn#+H(8$ZP6dubI&~=*OLm%OZecl z8@!w*S35l}`}=YQU47Adl%~?rwQU?%+MX#ullGdO(=v?j`c0y{?!*xaW~wZX- z-q8K(y9n4P@zawFOYq%M7Sm;fJsNb`!;a=*go+G%pVwg7;5=s0Z9D}Ojp)@U`1bGW+T+E^65T7e_pzgakeD7LQoD?^&-tz(S#L!;mc+VT{H*dD2ZE+}U zssp;z=73t*K+-Wij&OAcVAMd^*DLtI`~ZjZ1DGqE2HctgbQ+z)IqWo$0P$$DuqFGl z1}+WOx>`}1|Lex=VKfPdzpE~y?!aVX2|yyCxz(J(_tp$rWXuPar}0q2(I*`zZ!6N>Xwp%dRo!)TK|IEYE+o{lhwhS-J! zTx7}of`No3fVwg0HwOJC5i(BB;ZudY)$lF0jKDD#%9ro85c3S3X{XrXFe^%ph&Zky_VGVR*j4-Id zRY&V3bYLnBO+CjQHLvmlTm?34;d3r@ZUOJq>Vd*$gq>uG>WGK+vVvw-p_{oBT9f%a z+U@|O&1L-6;mf53n(+?t#{2l&^1c9?e!m2_B7jDIG^y2M-k7!QPey^yQ9$-~ymK^+ zYdSQxngFKDbF7D^&j4m{f9pe`xa+Zy8$J|5|IV<&Jg5n9-@sJe3clv}u+=O+7xVpn z5!+^@>+Pe1X(+^YO{$d(*Vk^sbdKw$LW67Mq)p~p%Xx1S5~p=*67uY0Gv_zH@eTT@ zLipXQzYnJ|rT6{+^Izfki4);Lgw4D6jfDO!+n5jM(K@D2iYZ*rXef)YsTHi>F=#dd zT+87CV^JrX&6+}vzB^-lSO1gG1L)K5Rtji=?Z%8>*KjCon~MGB{MZ>Z%mCoX+uYoI zIEydCl|Q^5=le&{h}wSuKVV(m1nt+SuUw+4ZtkY737o)23JzQ{S{lF{MBT;Vpe+b>k{up?C$g#!tpED2|B918!4P+N_{>4vN#KVf`UM6<;%lE(k{Wu};zLU;0sr2kU8D8*9z|A<-9`Z1smM`Tsl_5K~C?I{LpP-{a z<*$GJ>u7#ZTKddgbWYSpMn)o!NJl63@`sa{v6vH4lc5}H?;MY2&q|nMnM5l5tI8}E)mFk3zn{n7$w0n0bg@ux z352eeV)pEAqQI(X`?A1<8hZMannln&3&3?A0g3h7i4c4%es4N8)x%mN6$2h*K2DV`4s55Ns#LQYhTHZKwAH<~K z)DpYY=h;NTx67C&)F)SkIBefWMYUZF{`TO3<4g&FtD{_C?!iV3BFHlzDAd_0J&$R^ z$YZ94EeyRH{ezs4Y3B`PZO=GRy?h!ua^wDq^(B!3h!!j70eyZVvcb#6o&>v zxvMV>z+0v6tzkF^z*S{FrHRN^mRpH!&|jz%s>D53DTi~jrEt2u6iu%#A!uAclPhWx z#gy9#xIu|;S~M*lxR{)jytF*hLQN~p2iC?)YX#Z+r{?Us?uffk7SVtbpAEfd6&>BlP?|Rtxm9KbMzt)?k>Hhhj|2g`rR;xw% zio!U9z^3N>HL)bnm4L7HX=T^{Oe{*pVrSe`+fU&iLc#6{=M&gFUsMR548tna%!A@?Q36)!e-@gHv`bM$C>@k zD3DPgqd+?a(%38BU?2K}AN(Nv>Q}#t{mwuB<3GkR*7rBE|7%Y_`+e&a*l>W$%1!`} zjG;f9h7OX0C#mb;14P9t}ccrC!;1kOP&P5LZi8kkeuPS6C&oUD0vaC4ALyU*O6 z^5TmxM$pSiz2C17=F!33XYP1$=aT?j^0lRzLGxq$4yfiyV9RvOhh^}YlTs&=E*#94 zc}dz_{`TGbEu?yK;^c4X;N)BYGMO8cW^cd!b_5EoFApc>9@18xNC21hoIp?MolR)& zH;%f!%u5J!1`&qtL|{0? zu4RRzmlJ#5-rQ%g-zWv_k=590?UO}dOue4P=Z(OXT6kriDQeJ{LlRYTQ%z2 z^C0g$Sj6AWRU~$%(dzkI0vAUhuT9h6mySrS=jj_>iGrHTz2~zpbZ8NwRYVA&uP*_m z+U!DDo}2*GIvdKEzv}3(;wx(~oGS5gCqP#had+lxp-@FzVGgY=K(+cfzPD!Zx1~QYgm86DmDU6+ZoP)0={dB) zsx` z)G2jdodYn!6y?Op2tGBqu3k7AYLlPxT?ZOaXhC5nGv75x6kU`D;ur^GgMPG{Y|XXX)xjy!EX1hmX=v2PpqFkj`n z+QYmTD|A!2=l)Gh)=<9Rk1Fe~0oG&i?fB@~Ff(-=4c6mfFgG9i_OXT=c{pr+^odX& z*bz+^MvB2-YMa`h9@v6!E<0sA8$;}HT0gVDw~qpjX9nlA9tPKAuCHC!y2kR_-)SA} zducA5zW3U7yc-hx`ta+=H$#9#J6W%n@S!!0$=+fY8$a=>RbeB>`8mKTOc2h`<4cgb zcC*R#1Ocuh0M`_t)(jg{>iB@Xz;A5kMu6+{{sFHQBb$=wV{1*;?DTgvz^9dAHYXf> z9w3VGt;~jz6YqxeXFm$(&YX^seKcAN0~g9+sE#?uQfu>MtDjt#Rw@r=la&R^2D|d% z(6(Y2Mx)m9`pV6)d7^!Lis_!R1=rB7iLD#&`&)oZxrbq7WF*#;YZn0msELsHNZt_`lQ#^huSoA+?(DY) zH-viljrZg=`xpBYkM!Q<;#hyrca^bO4rOV&Fp-B1hYlTzaw7R(IiY2I>ZzxqEK&KM z@}P{T*HbjR&M1&kU?V7C-zWy499l&S`%Liy=R#r__FeW{S-ATsu;Bn#8q}N=JHZmf zP=o8GmtG3r`qsDN#9C&NISfwL{KmsU%I~ffe9!N7y6Pb?r8dxe@4XklcL&p#zx?I+ z%n4xo;NBj$1FFvj;eLkGTvee>|C`_ZX88KozaGJsr2gz6Zakj-&H>!P-1k+Vb^+jX z8QlipVIF<=ehX=FlqTZVm%!G)|NFm(-~8q`aZ%-DNLs0}<<2s9Aw3D&HtgTQpYcpnp4%u zsZhjpUk+bHxxu-R!`xc`Ai{gJx$+3Ls>{VN)7=qfd+TAkw~9|L7U8J8@b;y2=T;I@ z`J;q%stX{g7fr5CAkG}XMtx=?ER9|W)lvL~&X7KuWHp3$b%byY%=*RrQNK4F+8EF{ z1o4(J4Y)Km7fKxfTnGtC09BnTz{GIqLx`9ISY?uQX*q5<@rxg*6Q(J=S`MK^2g1$) z$6qux;P+`jw;B9!EnxC-sV%=3zrMSF#W@7+P0*<}c`AZfYGLI7r8Lv0rj{Ha2-Lug zpP-gN*pgt@_$LT$heF5j2;WohXmfc_Evc?OPlet?e;hh@9s%I$j`2ioD(XvrSH9P* zA~^CnC087DWi@*v@mjJkqUO+?m zL^Vt-U}6jbZ8Dps*+hZ2#feWtW%>dWXy(m5XfzJ&0>r`(4gi577^VEe56h|m zTVN{-83nFE0l}?0f41}#!XF>%3C*bs;dh_B5$Y31L#{R#cJAF3oY%e7@R^Mh)&NW2${=g>ibZ3jp?^SJ3S0WKOUU zPQUYBIJ@erNVBt}&EfFt3j-lPNhI~fIL?~?OT$G@hBQ(0`N6FSz&fxr(h2y4SR>}) za-Uur*>&Ghh_9SMA;0yrehn;u^$-8>4{>+7YwY*me?P9Jm5(S3Q6{1+LK(&SZ?8KO z*^7521*}i`LwS^zjBKmF{q1j~*~-ghSV66a-zk?-79((^yejnpm-{Z=O9EXtDJ%D~ z?@(^z_kwKg{YU!dT4&?*d%-O?Lc7sixsRs6G|j0y3+0GfW%`T1_=|Wi+vt2Ps%FnK z3S<QZvx_d*Q$pQAm4?m0(z>$%WsCu2WfE+MQ$KW@nZ8|ck z<_HDHROfa8m08s?Q-#}IBLXgI*Hg-$@fe4LxbX>OrQIgpcd}r4|U-q4&oKOkKY|fFG0{fFa!g9qMms%5MF-RtUshopN(# zy711_u_B2g{WZOI6tw9}>r*r##t>}JBgj98*})H&7o*me_1A}#f~^c;l>5i2YwK+n z0OkNf;w^v-4Q0lD&tp`wVeCj9~pyfUyqplEfqmpOIh3 zP$M0+0tLhj-3YHsyt|&K;=?cU9}6r^INK)mqg509nZ(~FrU-M44Gqi-6$aVSJTwzJ zsH5I3Xlj)P!cr%@vwQK!RjG&bUHbCmeJdqVaW(Fggk-cDi)wGFxm7~5+iUnEudf+) zs4tC8hsp(j3j}V<06v0Sb>eRTx-}7?rKpYTX2Kf4Mchkhh>2t6bEHwNg*;kgMK!wE zJ)d)zE&Oq->0QiYq5{GNd<=GN9|NERM791 zT3dDc@ap;Z@pE=z4VZ$#AStaCEiaE|tpaa3X93_Wb>ZgfdK&m$NDd3rAm@%J;R#%~Sd*}qT+}hs}_71>r zkQe1Vg63@zngZxvm|F?313uAk#|1!;2Ly9IS;dUy;%9(wjVc<9yQnubNddJAy<73C zMP32l^Q(T3T9vfQ`%%NpQOG*aLPmkBQ$Q{e#?h8Ksf#iiujIa z!#w8x=J6F-XY)mwF{x{C7!#FyL#5agM%e%&prr4{xMsV~u|f^5dJ%EWbwQcy+aaB1Rt@F|%lOBvF?VPIUCil<{rEEM3^nEh^=^E{4eSkJ=5#dU zI(y+%SU&jy{phwhR;UH*xM4{1JNxz4_{*96+E*`OigRlf-p6mE{(5uf)Au$wxE@x{ z;juorW>(&ybsX0(uD=z^35a>mwYArNo7UCqZ3@`dJB|M>e#!M?;k!*~UvjMw*--MCivdx19768uUsoh!v> zf8_VZr;JEn?1J%XpqX!l$i}HGNxpV%o-`7by=DA-CCX;^GYVuB*a!-w{!Or5*|mL@ z{h)o3A?t%Sg37lij#~z}QnnnZ4DR-FfYRZqT2(TF=%<6I3?VZlZJam(P7&PT*?5fG zfm9I7G#%X41ailRlW_;c_B70+*G}}@x$@&5|2X{QCqIdke>I8z$WQ#w(xQ;-hUyCw)< zdF7R8LQDA@g{-}z2>5Az;B{^1Y9>z|#(RM$dS zTt*|5Z0moiPr)hO-ZWZ10$G9)E)Ck3xBiaT?KkhPV&50Jk^Jf}I7(?|@^wruy$kRp zxTP6FwW~bdZeoTG5MhRQG)L%8^g{@`U+NkFoa&DC-o<B z)8S3h`!>RDwf?ptfL4>s_glgfg(WLtj`!uIsU|*pc)A||wF9BJ`A%uv7nPL=*&+}? zQaw}wmkQ+t+8f$VYGqB&heF>Zevu|aerX|;@R!wtkD)D{+rmP3Ax!oHRHNxtLO`nn z`zr;iA)0?H18jA66fsfA#ue&54{zk=Fe?`UuDP%X(okDOKm@qeRHICgi+nW@qNRT0 zN@-l{egwEMceqUal_~ru>Cp{7C}XlP*9ExM(;dnPBnvF`FKagGS_xd~IXuU}%Tta% zgd6Z%xw}8~l{&(fu5uU#>>B7sv#W)^Tq%~j_I|7v=81XQZy8N2HMMFJ>NC2v5ICShd0;ssXr4dEDSMy7AglcomzW2Q_|MAa4b?jr}JqWPG z97fG4KrJ=4Ov`Jv!34n?mAUv%2Y#@ML;JC5wFfhT2t?sat+z!BZk(+N+qvv2rl{st z7j`PU1U#(+^19NT3$=x_p)|BF^gZ--{2ujD4uqceCo*$<2SJutRu(b}+%yGRBaXZ% zpSsSPnwbya1!2#Qond7EzOaAK4$Rf{;x7sQqn+86$iwYn{dN1Z?DytU!2Zy~wQ~}7 zU+>tJ-t)YOVA=Jv>p9o-xz1kZOJ)2uu7pv1W>uEZw$?x84NO{G|K*EV>Of;_j&ZQT zJbRqql}=2?G8SI%xF-)9d|&^VbvB@QEW^0wDdgC|0KaxJR~UTcW%}`-N7J+Q(f8OO z!+c@)lc58Das_rBYiYH$+@L1_AYEN!E62Ff_v_=!uJ26>$OFpXltbxbD}hGJVe~7nA1*`k zZ&BEPDfm;T+tYjxq4t!2}9gK9u=HTQ`5)U1m${4=u0JV`5trS-RNE~3*6ms{6 z+F}mA?qYJ#cejc_l-gS6QxL`px&yn;IkoMp=2sfXJ$uB-H+grUwhRvDPVS9IEj6{r z1iGGk?zyP_Wtx|pAl#iSaBI1eHqyfo7s2cfQX}qnzx!RJi<2yO63GXeO7OS#lSf8I zB8ZSQ@ccH_<*nr?`#Ph*%~K$?cXyuI7c}9^#i{Ag1DN&UyO=;_;qCfWb9SGx<6qxf z`w$GP+0%*UkD5Y)6$*x20qe-a`dDPlIfh`m1!mz7 z5b#OuECI<8gwoa&y-x(R#t>Lc0dOq29ep(jh<$)>9!(VPVQ23Sgd5hoK$kF;@fc=# zZxo@qCJj%+8>XYSn5HWqM98kj*pJZacmbjGLuy{|tw7jlqY}=OAD^4H$F@8`SWh|Z zh3^)LL+!3sDyx~g%*p3>J!iESqCK!Q-fxf(55cZmA-ZYn$4hOnY7W63fSF~j;mf4hH3z7o zc2zkP>5p>EKU!ntYKF=Ctpwk0BsE55Jb< zdhYPyL!p-qent9)1~1w#T((z$6*F$U6E%2gnrVIIn$6$s*O$J1=^ei_xVG0^Sf26d zD=&RL^c;R9OjTFHbhQ$urU9kU_FG1a%kkoRgK_7I^=Jlo0h7Y^%`=Si)gqfz;lUdP zxau4u2<}jW4hMNohF;GHugzqqx7*CUeW8 zZ0%}*S$mw>?~DQ&1u_b36b0;elvmqV8SJAnaBHKedwb&9Fn}xB&K2C!pOw2pzWwcQ zN1MQE>bRJ9@Y=}WK<5cx!uFpIQ#`?jR9dQ>)AL-MJ$0;vqOSGBOf%Vu1x>1wkVU zJ!_g%YI6N7YGD<^Uck)908pMmLt}TLqou`1eAcsICuheE|FpD@77RTp9Wuk(q zL~2=vGK!NnO9`nL4>Y1z{p;0npy;oIi7 zmFLpn?$CYU1puev7PuuKWT1_<0_XVCvo!aSH{wk%;2C@hJ@7}NYu~e>Hg>$_mkZFk ziOIm64pgi{~SHAX2nCLqY-kx5h-{LuD1uJM^Ewf=`jW1;J)h_f(Y4}1OfNL2O zg;l<{e_WWsd}6*5`^KAT3$bOnDI<;1j017Ja?r+{Vrk0=z6%)>7N5gU;s>qc!m;R! zG3L`v3d|GMGEYSIwVHwL*mgJqTnpzu3THc3!tZB~gxun@VR*0~Av~rK@e#UK{wo*y zhM%OmNFT1hcI}b?f%J~&+mV;{__N=42LS zHu{tiyh?zVo7D{pb(PV$fm@lEnpVE6HkiDY_-{Rb8Grk|^gEqnfs6v1MFIOMk1X6f6u4!8D-EcsDm(dgK_p=0A+V(8 zjyp*lkdm75Mv=$CQifAI%K_Zrz-~T7S{;xbF#qs}KSVG}tu8?>!7lTs`t*}eJ{b-k z#9RTpMT{#=4h6_O4Bj&?2X%M3crBQwinidE={b>b$BKE;G{9yKz}CT)j#z*z{IR^| z^Kz4pD|`~uaT1iY+5BD_Yl~S;Hnr!p%`A2|u%&A3$5dXUjyOEs_9% z1*Dc|xKE!G8J4#1oJapOvx|jrqN6i3&$AH%%?HzTzNscp9VBsK4t}H0u>LiBn2XwD z@TGB6j#B>)-X*QJKEp>@xSJ_J?a7B6YaJQ&-l)u=xq>N6Ha|4j>|mX$F<2hjgKwil zQTtGV|7HgJ&s@G7W@abDo9A8&_3=|-WMm|+>GYlJddGE8HhX59HvHDe)QG$>eKnvy?$p4Rm2EW!cIma}2ulcOJnZCm=oAHDeeH8o76XQF8W8g8IyS9~?nx{cuU zG_jjWb1O%$EZjd7h;s*cP4LK##%?q+1DJuIhjIVq7QYO{H`yT^%*+FJTFQ>!i2h3~JY^Yx^ey^~R3Qz!smw+Gg^ z_?*Bz1H#=h+7(Zr*-$U{h7Z|Mf1X8m6*xf?boy7)EMb*nfIeUt^K#zTwPK4EJqDt!LQm5`S`lnOgEDFMVybYUA2XEX zq2X?Bza?m1selQ-;&Ml*V(w5NtPhiiJ)8@19%y`gqdTJrJn^02R&1P6bVOWN%HU1h zCoZFd6j2CgJx7#Wa(K^>&aJCk`)j-$aXhz=TVUrryL%fK&ZEsW9R~ZhhTWYw{|4L| z-PVIvBW76vww#V_11b`PQ{_!UgBj)WY2(q;o(&ea7_rzgk5*xSDiySkUd^Ur@dJkGq{`Mv9& z)R*2P#Lu#MlN4}WYkdoF{p-K}YXmkA9y}PP#>c{c{`>z5g#%v+#Y3-zT+deeB+clm zp}NZJ*PA8-pJS`Tt6#>0hT_H#COyP?y%DANF7v@!B!X2A@*b^F9^4bn$;On|e`;52 zU%T2~m(G6_X5RYW^zl>pYuv(ygJPIPct4BAt#nFj>=gIdW;)c!{ zHaf#ue7BVXiO&*Gs=@V_fBBaYj8Yz!w7gO#ycYO!Q+m>-((IsCcLbQ+pe&H(GXX5+ zVQPeVZQN71r%=A5+|TD~VYvyyd&&Skl&dLlwNFtVm-42J&9vNvF32UoCD4_|7+qWF z0>sVIey{u~3mFA63S<<>C~zqSQordr9hbiK#lLgY0G9)mgNzzm63{`-0Z`|rPJSKW zoao(7)X=z1!?ZO;DA=OuL4h{4iUgn>d=2~d?Tgw&4%TXxd3LaNurwYAT6ek_pM$L` z+S(a*z;)pEo)Z8EUcVExanN_MXIzI5AC6^q&`!*CBkW_k9_A-a0K7K76lc2c*=GjR zvL4ze5$4lLf_39W!o&C58QpvC#B{dS|Cw+ z7@uIDG;zm}Y4~lTv1w!>qrlxr0fo!9D#0fghJpqP#dGuzEAlNMSKM9AJNnWpvXI{k z@bDD7K=s}9``Uc;<76Ca`V0X~7>C#0_A{KL;F|OLAjqNy(OGqHv?qG`aR_c06k0XuDvFE5~B)eH}!^{|aPIE5L&DXxdP-Uo=K zR-IZ_YTj92JGifZt!}Q3OFvsa^IbLb)Bx)Pq}t83@9qM`637%#qUVnwmK9;Wo5o`Z z!L9d21l($R*^Anr*Wnj6xFUcF_%hA)yN!i#lJDB<_%s6fUm!?P8&D8#2m#VChxs;4 zAyAiB&hg%4tr~WfJHscPJgT2)1Wr937CWo$KoVwSEJ=PF@Z6jA_7cDksSEq$TX*9(Bw85+>s z@umxHtO0y*Z2^u{3ZYUF*{qhD9l72xx zvMpF;GIGuelratb76gmn#45n04i;|S0I|@H+t(TP^kFq%aUuFRb6(li-2?F373L=a zXlLpnzr@@NkgLELptjgr+{BlGTP-r*6Mx}}6*fmSD$`L=Ze2F!C!$$20j>yyGS4Ut z?TcE5#on!1j?bWUVwpDpu*wa|O`k3*$z8zzj;gzoZ6c;KPO!;wcH z51nW>>bLH4!Fh>mcWI|gK>$FDCf?hKb+IIC%^NsJy8Fi?KH*pE%#AGEhZInAN-Zom zAOH1V|MeOVN(%dPWjn4-lx-;!a^tr0Gv_7ps(dTxqE3?e9do6OIeb#JKuMFF`o7@Mj4dxDWhwbW8H_6 zEdpx}oDRBHu;7=b@&w)lU)-JIU~Mqp?ZH9XZ!|^dZZ-XDd3MlsVAZFW<#e!?VPq7~ z#xL`D?e{kmQdvBkkCZpB4GEy~nMb;o#)4Z;7%a1(o|6w3A%b$|JDR>(Wo+X$PVWf{ zI*IWe^PbX5`A>QAY&yPUV{!M->#x5acl&6XP})nUGY9kl06+jqL_t(rHRCk>C@qZB ziM!w3Zazr)&CVGGZi)gnF(=fEn2K7)G?|gOppA=K&7{=ui^HN6q0a^23Lt&{t^ih` z*~8BIzht3%4v?dUb)oaTQ|3FhxOO1KQWIwZL8l$9+Cx1GtoXei=u$jhp?!T)uLS)? z>6ghMxU#>5mI}W=zg&%vvp=g85dKp$OOt+|01*Bhu<`x+Vg#8ULG$6oE}RonFTb9> z5I#fD_~-1r{W896)Y|F=I7&g$v~{)!a8#k*+=wh#*@NIu;7fo@Eida(fXXxazob(I z_>v>6TL3QNP%CRMK$yP1hWO5Bk+*oJ5J$0ighi-WL8{sLv2c!h2R4ZBS|)+bUsIM7 z@YN&4qc68kk3tJD9S0D79T4v$v_>WX@16!sdYtbCX;Ds#`6JnjK_L!c(@h84g!zxE zM%RdCm0@$_HEM4GIF$sq20BB>Ko?pHWdH!Eh^AH4OrgBySep9lN@49ec`0<1L+93h zG#!RQz6ZZVv=ueC(02*LfL1e@*jqpY6Ea3nT434`&AU-2<$25(lBYrPG63M#jV4%* zw%hp>Iby>}6LzaADXAEk_sYVH8kn3_mO5yl+^>6xC9}dDJEf;bY2o!5{hu z!O!(UA!#&)NdNLVrr||!+)xD(?Hj_M-x1pLb^u?xpMu~q!RVHF-jin>8E1nM<}%ez zv_WjP7EjDj_UG0qKpT@Mn)EC6Ic5-!?exP{{Qb;*^y8@QSLhxJojZ?&?t?Fej;#+w zGn$&hGzd0rUZDR4P^&LY0ls}0mM2aGT=0c0TepP+`wv8cr)vP$AX&ISD3I#f_2OUs z)nA2Q|N2+q7r*!=n{*nixBEhaO(AvWRIz_r<=Lwa;Flv?9E(;TI7X*y&$l};pIN~q zu_kBNhTbcsN#2T#iG4@D5%Tz0T>Sn2gO+$by!e%`hUcGsnze9WT<@-5OQ-0(uhxrJ zW!(I!{J^z%qH%ifM$c*mFEZgf{IyM5!C;%vZq=n!4z3~~ZfMMEQW18M`k*nIcnroKd z-vWI}tIaYRhsS2~!j)*B-M@b+klLJQgFG33v-r#NyFNJ+7GHZaT=?{}aJ0!zYudnJ zOcL%y2;Ob`nVAiz(FXZsYhO5x({)|=b|R#jLF?lv_saO|d8SdtzY3=3Xxn`}>*rg| z(g|F#zKr0O<_Qg}7F;42=CWGQMRRoeYSI_eLx35YrPEv-{A zrW6Df=Mgx6)L06C$OBO9-5H)7-VzRP+Yuh>9|}jH;{^R={JSkc$5to4_6wY_Y@AID>y@k>C8_o3Op>zlZP((k-Z_;-4(Ab zPwNHFmkZ{Paw(Z#nPu1Z@lzp;O>oZ-TOk2)YLykBgFGM8T>Z_ik8Be||gu9R&DF@pum>^>AexmC&b{if`qKT$PV6_`B0yp#9UK<=!B*P<^yHs zQ3K3BwpLfdmib!rRfg*>1e}2VXml+W>G!w>6ON>k&i8kS3_sh(b>jg^bl^ zK725q3zJK3Hlkfx4YV;ehL@r1`C0mtroQ2vFD8CU=lh$w_iX9mg&bqLezvM($Ks(W zOM~Xl90Q`MG_<%{fWK|ZO@fYZl!{LV?4?Xk) za&hdZ@0mVM>Sp0qD3I1~X(Qtb^8wet@4x#_IC1JUn(Jp6!{OPEekR5E3ykxr_LwCEVcFnCBxZnQvw{gv_ zyhNFT;YQn)ZPA{=O%v0VW_bH-Eu5KYuzn{!#*8L&NjK*-a^fs6tf z1umt4GJ4$xiDw)=dNlUm_NR|L@<{Z5cfSZiU5bjL*`OkkIe)z*5#`guro_+S&@buG9hX)^g zFoHi0-p0E=c+Uafkm6kbPP#UZ6ps@J-#2{+aaFnXVdd@?HKfdw&!2kgsR%kb!BC@2 z+sBr}Lv1ZVDt|kXP-88rmis$_RcTUUK8@4Ki6EN0W}KWDyf0W~WAL|=9Kkdl3;*<| zKaCR{<8(qUeZKUiFGU);1IKjy#!jR;W8I?KI)Ep`17Y&PU17Qt!Q&JF0%oPky*=SVe^>Zve>pr*$%jL; zT>xU8VW13{!8Z!K7500SXdCTj2HQ2b1i(H32zecodYZe_oZ(Ao96g13LN$gojpssk z6U1DfBhTG<;iBFU>Doq-JT~Ymz&RhFz4caCE zCq4+>09-=|VFmy=qPEtm38*N%BW~+0(VD7@S5Z*FGvAL-xo@2+T<~4L6?8+Sy#{hk zP?sN5uMYsE9cp%k5*k5OfR@ss1EKgw&xIUj_1wvC=p)`g=KM9{C^B9x&_AC(cQ(BB z-g{vRUOP!&JqDOs8o+V$&X&XH>DieuI|smkiJV6sd?0-5kG>jqo*fUhvp)%ovp}$z z-Jw&C@q8(fsUe1i6~$;D5DBR)f5(IYjwb zpilZ4d?N=C*5H{Y?0}8YW`sV=IKF0V>8WZOa3yR5;M#@;R;h%5l{l_D_%3x=VApgW zzePyd;)P9AKYd>{syWU&GzZz{-uLFnpQd zqJ+kScaY*?N;!$h=3 zyY7!`->Z%M${*Z_>iYeyx88~%m+}+W{jRB{t!wB+>+2#P3EC7r1h`)NtQOuptsDS= zi%oiUOrX}u-*Ub?9NE(!c64tELzrgt_EM6UU9Md6pz=JAD+S+4 zGB35c)J9Y$r9jndWk|~2++;343uO8Jd#q)YLw)5dUy1S~H%EJ4IaJD%axCRX%AnjV ztxQjFOPQA7n{CE-Zm6AHsUX??i~<=2G75YFD4@*4V1Fu3U|;+F?|(n`$KF>_#yN<6 z_x%)Z8sKUtl0-NL@=0zHLcrCCbkR{M0=;TfnfvV&`%xf1D zYNMG?fv;CzeKoxQ{`(P-G7sL@Y@#-m&7ap!4E*h+IRRC^D_CV&J)9tzt`lxSH76ZE z{_&6FL`5*o@~iP?p8d{AxQ#~Iy!`UZF;B)XeFQd5$1+KqL?7vUzXbW;`j+qg-F|ql z9bmm*XmU4{(>h6fDIdF2Og>Kaq>#48{mT48SUPbEkn1dy>q>Yq)+augXd@ptflcT; zI)-~NDTOxYKuFl*)$%fD;A#G>y2R zRQN3z5Y66^w>kpQGb})lAyj{jUEON?2$<}{%$lYQ_2Hyeh{3g}@!ao0P)T1`0)id_ zE1CjSBTKV$XAwTE037YdWa{J3KGV`lMKD*Q4)db}n6RV&g@|f@>Gw<_^cqhMw@X05iaV7DH#iP9&}(c~xr29!}Y8DNiEO%g{snPvy^7da{*LK9192%%9` z>M7%ki?Og1;E8vbFodr@_eA)=9zGH}pvTIR1{zbi_$%G{+&MNZ1Vdc_h4>u{J!o;^ zgRD_3g-*+kmQ0hQfX}q0Zt`jct%f}Pa*_8+(>>uVT5;V7g?gy)B4ud+D6Y`1!vdQ@ z7%SEA)J$dko-A2o2aBDUxa<#~pvCq7&X0#}v{g-4K8A4mAfT7;$fsuU8l^~Cx+7-+ z$h@5n0O$(ZSdDqKvBqZUBQM~45Q4#5r6K$x^luOSecM9=ldKg?Ojh`A4&{>B`Ffb> zfKHexj2d;Zw0zh4e@Du+mMHucHDTm4Ys72%RSy`0>pNF7k>va_8|!l+o6>ATiMB~o z%EHwsVBONkMU$hESTbJQz4k_bwRmpRGwU{1p?RcVC}JA7z?cBawU%O@extNyf9Tx( zSoGQE*wNzK^_;Qx$;SU!WwabV-?`7fkQ^0zV)(VbiEz-9X&{DIF)T@hO0Zqqc`tdVoPKVvw zhr_}ByF(8fL+XsD(#pfNyz701PRbfwhiEayb+&8uBo|2Zz22I1>J}|QNMt6Eb#^dS zn7c9W{zauDSddj3Ut>yC zZWNDg2*4$PBGKG=AptMZlt|Rvq_Y)eFi-83nUa@yR-OZ|lTUY^{1go(cZt0C;)~&> zmtKkkYKp`6JgyY3#t5cme*9j#NFxC)2lSICPsYivgL!%`$mKikUU34fwv>5vhs-a3 z`OCElfP;w>3e6V^#w8HWJX#-yl&|&7Vt!;MC)yu=_+bRjjNAN3FW(m|Q*B%jOwdZ8 z&7C)Y`?r4^ch#6@c01UeKSJl&v9{uns&7%Dbg?(z;UHaG3sP$u@*|(cZY9xqm?$a z6|Dv}p|6sk^?76*Ym|Bd>XekF6ivL@@2ZuQhqi2Y34_dX>anbRyjp4cJSyRnVgYlB zT@yD;lX|JIQU1DKn{eHqGp@-mukv9YX{R<^pWxxbFcse>4zNhS&!+W=*a{GlG+ zoy(zo0s8@P#~fb%581m~)4cpg_t{>aujo%F)%zVLi5mjwIaVu^{E=Tx z6{ev7t*+gVN8elCYqC+m{BJIQ+F;44n?Z*5GKR1Y89yCLXvGe&(N6P(O|(LmHQTz$ zOqu4_?Q?7Abm>UzokY*UH|eg{}S7SGApelDOVBze)G*Y*EVk}1Jint z8?E*0t`#MDM!?KCvvB7qU^`CrYMrFEobF}ybLZ-2qf&0K<1|iqwr;KOtd2K|(i;mYQef)(8!%%4ZP?>T84>08Q4=kI>^yT}*^4<3wmf30-Q1Ii2nIF@gHJWgC?Ai*l* z5%4iyzx93Z3s!m0LE4FcfRXPy$(2s##W=LX?M^PiK{dFNnz!G&(?y}CzQI)G7Wh(g z%3X9$CIscoW1@SikCfj;3)4z8Fz+7LlN0O*&~`A-)}QHEb|)xK%-xaWGk4jjEoK99 z^5G$UJWT6;4vDt50cj^FX#HEC(o`B}1Hzr-5P99UC`fF35;WeqYbTTK;m}LF+rDi( zD@BB4pIr#uQ}c1dsPIJ}z<}Tc%l0q^C~%&7T^Sz>^UJl^-qirx0r0yM6L_a-FUQ_{ zKfK1SXMu`C*yUFfOF$;-q^vd(yC-`nfdGZ(8a30`)=q>1vn=Qr5W-F&+&YhD*BQW) z9@19^>gQk7R+f6~biQ0U(>*oX6m<+yH_v0jaT;39LAMD&$TI*;om+>)UiwHnrf?oW zsNB&Jrm43N-+4E@|K?kvIx!W7^BtHoMAHiTs%0Z!X8fk_;XT2{Nx&QdG{Fk%Mga1| zWq=`G-ipSKT1o;qf;pNJJ4c-vr=|&oCH-cCIOY*NXuc20WytZo1khF_Z#m51Mb$3S zj2ZCU7UbIkhy6(EYZWTlU(3Vx`;IC0$@VvM{GI@iSjN=l$2@zzUWsP&1{sq&u+!)6 z=;BB3gu?gGN&-By-?H59zHaqll%MjX@xd{xlfJ8)acH0i0VlLOK6yUOFHVGm_`B*X zmBR>{OnqobMG%nK1OU}cR8%1#=((?}6kZ_T^)g_i1V$5}M7;Ct%ATsNfGHKig(~AF z;L_x5%l7|u4Ji?kM8I7j75qSjB0whfQinHc#9akRba!==BgRMCsjqgNR*P$4{9IU? zn+|i0`EcgsQNS`x@1Y4-IX@care?wnAkS>A%LpU7ADRd&yAOofp6y|Jxg6%l@xw4Vi{Gxv2u#*7b11DL%_Z!7r7YY^k+1o! zw1*e!XxKHXb0N13ZvaR}!6|L@(p+9M#_WZ=jRMv&ZN5PrH*1(i=i2%fsEPio=!5QD zxXATt3OAQ*EA%(#KWv#GBx7oG<=GHZpSuuh6QA3Lt_rmhz zsgUdJ2`e1~VP?vtYpt;|eYP3r*xxb+YL4ACiT$v@9j6=v@Avh`X4FA@ z8Xc@z1vw|Dn0KJ%yfl3wEHzr@@N)G<{9$fq%s@Lm4g}ZR{+Mw)cH`GdA9X9tm0~+) z&Jw}0+ue@ge*y6oz~wrA=xXC9NT0D{wSTcc$>o{NduFblV}7syyypC9Sg1~hV@H=l z51T&r@7>M#!Ui?8SPb&6YjZVSoVU4V*X)|>c;_IlOPs^`-i-#oXi+yGCTEyq&SH*m z@?5B%emyiMjz^%p(AkTxuqxIjCc`^#yhi(N0>TZ3I%^o$q?_4xQag5iY&%x|U^`Cp zTjdN{xVI=^ADrq>8J4mx{k6+m_RT3+&p-Onk0KbBWKKSl544_S8?apnmMQ;Ao4$R= z_g()e8#BGl)py#y)KI`z^ovOD)01(Z!I(^S6TS?wTAkJ|pM z=PcYk6iEG|a(Oo!xFNtgQr_u3+p4l?F$HBsDOkt$z0N~Y9orAzi8{8Qw=Xdt&ILB2 zpTA{*OF~IViR8fKASXfZ)*#UwkjYYJ9x*+G~-~j$rak(8$TIySl7k!7M>HCxhnET`k6Co*Yzk zy!qH;kHv|yX~_sOr^n3%^JE?b*-Y0-h)!??)1-k7BWa0A8%-sq#&k33eG$L0t~{)x z_Q`wV4?C3%;JR})Z@ZC~ZL4ZdI`Q_NyOIZKvxB|;q1*t7LUT*)nh7T7iv9(s%1)@Q zTYOKP89k4`qe56@aX6`YIQxwO1`~I%q0Mpb<744uWg(nL$bGJ(7QPw=qNzcJ{;hDS za7Z9Tuttz;5;I>bY{vvrkD5Te2>rJaZ;y*_B1o~^IZEFClr7`cmijFktVGc1Q8Z>I z5mbK$Xmq}Th8A>t1c2)R{n-lIMs6lh7-PNv?6MOSHxeBY+obMhSlPB7{+MM-zPlTE^K0Fe%`n zMwjo%SExV{IRF9xSAjg`=CO0Xs$_CKm1`d(;H9Zpe;edMC!Xh-yqrGuDZm^P71Eg@ zzw;adG5zGP1Hh+5KJq7zg**bOJY$D(D5w(PGT5(sD0uO3^3&}`3fjr`p<#ToEQQy` z&V=cu>F^}b)kC?SXqxW;v@kbnshPIGp1|WGU@grGpLC^gc(6Y#0dO6q9aRBLI(xc8 zAD~-bwTVBXDH=wsZ#a1YzrWl*VQ5W3u`_(w& zt6mam9?iaj8h;ZPFj0!BQIb7(`czmhvN`3#C_+2511ax3rWw`9Th23~msZBL8WBl^ zz4Yz7@wun3HMQ8@2i$rCLHqe;jqmy*aNP?n{phNi536}x>mgRJ`S9|=#9RMc&&|^{ zze(?`mZSZBDk@LESXe-aU4#!jN}jn7Lf5%g=dXMOPc#sk>RU(wWn*EY1#sCGugYATlf^8RTcm(> z90lW3QJ||p+WNNMTL9OcV7%2b*(QaA5Y`L6)n`XTb?kVkO@11+T?DpDgL`Oa09=bR zXiuI49N5O#g_&K(rfat6TO{4*K8J2O`a}H+Rq(-8gNB8^Jz=HX&zu(1=_P<`KyYUw zn@v&2Dd*D3#I*glW1eBNh4i1J*?oGE)}3m`I|!`++*X-i*U{c`tmxSKApW>^@rcO{ zbAjs$v9HDlX9duR%?N^8_SM$?MeWS%is|NFqQ5{D9&l|o)TTcRizj~{+o_S|*u>&S z34yJ=CK%b&W1EejHGb-Y5!h1j6w4Fm5iJWczIU_1?!}o~ zleyi6Y33WFbD?_vBzb=oAEINSW7`9vj5cO%wOo^v6XB!x-^GmLUe-XhIKQ)9wdeC@ z^Kw1krFN`5L&3OZS1@iKlp$?aKCUOP**iB*0p%QN`d)OX=M+WnMH3Fvr zSB8;!)C`e91j&3RQyGW9tt<}*1ewo4-@#i@NubIdFEX7IVDHO(GML}^zBKh)wYCl( z#1=l^*~$2B8caOPkRCS@%%AZ{8-ELOX`V6J@N^<-18|bzgvH;tG9kZ_yxmLhN;?nh zO1^17 zcfx>r~=lTS~0n-`e8@0yN-coz$gP zLu-k@6Sm_bU5W?{83c=@nEzVOnrOP|n<@wGP{W2!Q!Lumu$ttz*E7I^eTA;D3vIgH z+jr7uwKiIu(-bVA{AqTe*Qvh)_(*#U;lwa>Hhs12)Wk8EznG`h^i{oynp^-yqog;^ zaf*8Jef>_Uo#TK7j9sIntb;C%;60j{K`xCBRl9{-SxshgPnC08If*WUVE= zTK?63%y%{hKzaT%< z&}dQzuK^>j0LtaM1^ik$P;0Y^$wIHxcGHIyvfr==ur+jG-fO8CPSHo4MS%2+=1lnN zz)*MsUUZCJ;%E=4L~-nfQ8cRvhqQRXvT?*`s~=e{t-A3C|KXi<_zJgT@KeL*uUF>> z#tE5PX?bB9yiC?KGnlh}R^#Oc;DMkjb%Btt%RaKQ81l4-PE0iR;jFF?HjyHF85AY!sKmloY{1*6#LerSL&B{!c&TXN9b!@PX8Cwl& zbpeYIxJioN(lB%67B`WZCyrto}I1Nn3} zf^DNo`(A-|c>pi|Fc-3K)EA+Cg=kNkOj7$i`@uB7PQUH1z2|inHje^H<9pYhz2Su~ z1Nbm_y!FQGY$_>*Vi#**_&S2i^3-+naa&*QH}uz0qY6G;i38Scu4Cs8q^pKjv1d4R z?R`3w@rxHzbqo=3rX92fRr?%y(reb?d=n~DeBLtMBwubI` z_RyZ!o5{!ZezU$EJHNC2ntohMk*6%&n-s8al?}<~Y7fX)$BrF~b8W3n_*{9J?`Xo% z=g#dtRW2rD2g^`GgSN|5UJPSf7s=Aj{rL_aB@Z0wjfFqc*KFBx{-**JGG~budQ7gwIb@qO*R+e!JYAIB6 zFqb|8Y5L7lGfF>N=1W1PjA#6UaH8eLr`DA3n@1<4i3w7<5^%RZuQzk8CYb=5K%IFu zucE=GFTmw>qUp`V|3&>qns~@#)}wWweoHeCud{IHC}5pvW>aUiPP9EH=nHIXOK2Yy z5Z>kyOfRyKJ-gBpbn8o}lQowRQZIF`)nhrKQ!=3<7@x74D zZC>WzrV45ax{W;L-?P(T0T?x=YLs7E2pCdSN=kX5hvoKg>8t5G!N76q=%ZRC`Ylsy zNHc*$e4+2N2hcRy>861JcAlec@+q3AnuJ|sm)QV={JxcruoK<9SQpS;e95{IKr>B4 zjnq5@)2uHwz5K1ODFqv;E(N-l092A+t`R_hM*w^tV2AGxcl+{gOM8#f61CbzIrv3h zEOx?2^b0ovaK+5E{c&6~t^s&)5YQ^OZD#~#t0ysYyNEw9KpFW=`sEo{;>2g`j*vh6 zV8{Ww#NzUd0dg%?`!VBn9CMs=lY?XC1x#qop|#kF)>R&%=Pb`pA&8Y%ji(PYgB_IE zG8?6)Bu&@!NAY8IW*##+2&-fO(-2rHquFJ9nnGLZ^|vvd2>7;r_ueQV>%v!8nfmNT zt1^bRJg#Ln{fOCb(b!wQswRTl*B9AKwkzyZTqwQkGkIJO#X#0R&D;#)x3p-YN!|rNNI7XlH6LzP5 zM1S%~aUgW`(pOOLo#f+^Ao;o9B>pC}jT%r1?22U|e$LWZ-YI}KMF0vK=FqSzaOh{w zyzxKMcYPYRKI=55BLGEOmPfjnUX0(YMI!Ns--3RAlN0Dio2!Hg*D_`9roof|{W|eC zvI6kFw1OWp6zH1#t`ldi+Q2*$3nI#5dY(OExrjO@u|9*h=~|j7pjY6k;BxJ^8ixX1 zGD;TiX$nNXXY5tGLJiIcI@|YB$1C|eXTEN&DZ+ySZki@+VEU}sPyZ_zPTygWH#O;2 z?AaQBM=;iQx5>4V=oaZ1wP9^HnkVf-7}=V`-bsMVaZaJAXWOm6ombn(+mB^ob15JI zJ2*H5fAoYCM?Z*TXuf+(1ch2aZEH<*y?yLjU(K91_R|!nWeRX}`|2G1MxhITLR$_- zg07&os77T2v(GDNX~)eGZjfLuBM@9iGk67)&3M_4{Fv5zmgjPOndp(^1-DXbu0JZs z4razKg!5-U4YOyDhL!1aA+LY1e)^PN`V=+IXvbZBm}6f-OSDnJI?JbV{UUgv)fwB8 zA?58>@^rOtrHSoVd534|leOckQS9D(CjV=(NZFS>uAIzk>sjkWYHKBPSgxUc$FuSg z*Bi>@)Z#jL@L=>ouY62Ck#~$c3wNFZ)`fLuec1=4I<)Q_k3F(*?^D1&+Pbu^{q5N{ z=s1zp@!eU!%6P0F>&m{4%Nl?ivV3 z3hZ!1pxxEKHEc!rUfjPgRA?7P+DMIE%>oO%0fu|{#s zj1`uFsN@kA?fg?~OH+0;9D)E_Nb3lKf&%~~dl7iCe2xIwQR2|Voxs=A?8a0hNH8dA z9NkWO-D=zpPesb62w9Lre@tqwdA584Rccu!8~qfde~3{}_Jq zrsu+M+|5coJkL(ohXGR5xDqHcf1i@hF?@P`gh1m{=s!z32Em*?)WHD+2G*5k2$SZS zd|zU$DU!!rFM>`HHUsb7OpvbyKG;|vasWy7vtyw~ zdA1b0!u}2>s6-m4GmI?)A;mrWL-D!iLvG8U%oxFvltJ5u@p<;JuXk*+FI${L6Zs52 zHeY))jDK=6dChbc(}{tz)6EtGBfK&>oWrL~XBWWnz5{?YEV2>e?!;`*o9Mdpb}lSqu5fuA-&4fN0EiYwCDdl{^~JR*Hvqhv06Hi$#qcm$I=om3=RT-~ zu`^3yA&=H(cRn1%vHMV0OOUkQRG|P_eF+DvHH5Wj_BHWk)rbc>oV}*pmQAyYMNFg? zIPx6D4vtP1m?f?Op<)Nq%EssZMhzf&oi|y?}NYaP>ftL-6hBv2FU7|p0y$K>UX1Ze>c1gtc> zrjT5pLY|vyXu*H_@L4+d0r^IQeEZ=Day6NI@X_XHnR?38#xQ&Wd6(08-y zICfeQu;Wi`i&2vd)6%W}gmFLiTa5i`W=@|8b*$co%6RBv)6%Y;J6OZ-W7Aw^jW6xt zRzJBG5w82WeXi?tt-bvGr#}sUc;nqr>DU>%9~{A-AO2mP&km1-;?TZOViV7n!a{hY zcPcE6eG=Yy;|(_Wor|0N+~MsSRpFBB{ZzK=&d3eCnDT5|wqyB73pQ@5&D!w|5b`d5 z)jC#g<;FNo#49sWo@G6cjEqFUOOtl4E0Xq>#j$@^Ugx(S%F>j9d0*bh!remw>p0bw zGD&4y0-CmC*IrqD-92@6vpKPjoo}h=U^{k>mHO(m#=hCOv+r&n1*|v6aNDGymYWOg zX9c_LQ=Ln<&zGG;xXE8kqrDv)$7Z)<<>X=~DW4lbrCSELB&bAF1kTQ>5wLB zPND>u)U;CA<>0C&hoIEM4?i3mt!20t0O30_gPK)pe`!D1atlbk{PN2YgtCGh&=X^% z!CBzLwBLH`t=MU34$;9t;K(=~6zohqk1z>vav%)_3pLsF#1l`%w44-dMv%d57^$(? zAle(nX5`^sN+Y!a>rnoZm*frUD45c&9(pg8>x-J#WJ)wgTh&)n1L5~<@5kZnTOWo6 zMD@Ku0^JC8pG08xLa{rbhZR=P?kI2D5$c$~o5RmmjRpNIgTHm`BC)G?G%N~i0ATD! z8$`2klY#)ehj)Sqo@mZabA|fUnq%=VC@_#KhW!90&v*8P#{szpc&>)m1f~%Me$F3yg(5tY@9z~2Z@oczZYoF%1AX+$B4#`U)1lb_{)Y4u z5ed)Z6*O>IErt@nMETI+kl%rwX2CVTzf#&fi{Ke?=Kx_U$4-W`=V!vnPenn8vA6+WHYiJ@f?x<58G6x5+gDuE|AXT9y!hJNmqUl2NqEExk2vIA= zJ`+Ge5Fw`~Z8t&_O*X-|>v?E1@^tT~LH$9y<}!0p+LD@aYCuLtws4W{TA--U+fD7Y z+Ann<>pz`ujUp}0BeVg~q-gbbXf>k2p!P!aWknwDM6j$a6Kj~LW)npO-vE#z&FDL0 zULlr%k|qg#Ug+6^AG`{$Y<`|&Kd;8t{8&qKMzA4{r(43{7B=^68(0IlHamOL(sh#S zD%V7=lbmxYRCBJKtxaw}hs%-r|MWb`*gDEau=Dt&{e*Sx_!vGLxL;%=QUOiGLRUX+ zPh-E=AFSgDR6FmZEoc((Vqfis&WrP`>yLHg-fZ<QFy-KOjCjf$obQZ}o(-d?PcW|=34PlShN`q=16FBhe<*K%hH36dbOZ-pI&+V}0Q^LtL-1PUMkVkee-fvmhY zZ|0kCo_EdjoaY?dzG~K{Po>@PM+QJAPo50eG5`?myr-7wOZRf@3Hz~RB0Z6GCDMUJ z{WxqT5C1-_W3?jznHrx}$6^vl=cVJ)jp&_B>@Ml&bjhJVtbg!(2O*A}G*O9HB6 z)vc0rThdjEARzs31aLiAb#*7D5s0ZxW3~FJ^ky2XRma+*^k7Rs{WRP(j$Uh>tojv* zsX7+8q&ikV*7+fhalf8YV~OSg?KMZJ?01^(7~oO??nXiG^g(pJ7EBV1I-e>_uBkrz z>@%lE3z*UbD@K$URK2~uJ}9f~H#3RqJiTOT!WO_KRQnmM&lN{YK8HhaOXo?^rWAgb zm4hq}1$3#==yx?X{T?QjS>=#5l^UJS)BW@!r*yvu6qPM3U$_s;8tt!?z}51JWOt=} z9>i~6M=BWYJdwl=nH0FV@7h(4TT{Hrk|=n(P}nZvDzJ(&J0`beDEWg#-|&B2t^-szl_p7B(!3ilj5U~#c`VBPcr0By|V?HLr`13rJV_V2^Bl)K9+Jh)eAoWq z_g}Zw>(<*67k95(?ZzjceDaCMwfx(^{agF>uYYZCyzz#;{`%{__)#&##h3OfTe#O} z&6{t&`KEpN;fLhc?XG>>+B*O@QK$fL&C`#ioEse*xADmd8^)6P6!UqCaz68&*Q^ak zi^(`{xf*DzfS3Y9VjVajl){d_T%DP+)Fccq++S9Bu`9Dxk#`7irC5J7(MG@j%vRgD zew9s7=Za63Yj3iK&K7SM6?K3xQD%WpCF-Yy8^_W#1`{|@R1e&O`v{Hae za(S3(%38XRwUpc+!VF8$uB4>CI(b{9JQdnp8K5bVW{hII)44u|Aa}W0tkMs?T`bR_ z-lSA$G0RF*0Q)23R)*P@M!D9|ma>%sy8yY`3o#o9ENcdA%i+Q>Mc)>XT@tWXXK)Dx zyBtPD~63?OH~<9 zOVdMS&sYk0BKKc$*rfs+9dHDI7wCAcc6+Hz-c|TRW7Yl9e0zVt^t*q!Ud4K;t~~WV zee+^V5zd^gF(k9HABI+&EA1tZGIN?rCnbKmeI0-ou3rSY-ly_?^)}a#q3W|%+w4G;vMOGQKCRZ}WCroS(+n>lp8-j|0=9 z-V2b0yWl0>6&547HpZQD0Sjq>r7DI`RowZ8)4X31G~K&aSLy?byDEiHp{32o(bCW% zJU=X1wtJgpIyd+j%;4&VB{J^m=qgxh4g(%W88Pra-Lr>rnNSL=*I62HvN6v(g2lUZ z99mP|&lL6P`zh^j=3dL|Sh_kHE2#adtw|@QV`0*{_qz>-_m1{ACxPYlsn5&5-&_vS zSr4iNZd8{y`t3n|p2w|RVSfzw58GIJx7yfU0k|YQZK37GwUEO5(ZEy&0YPFwiE_7x z1)P*+vT_nCDJIl+zVjVt)r6Dj&9b7Dx0GkHR*+S=;*tm~d+DW@{L%ExAxITgj;;~l zrcD5t${^rP=gERadzB-Un=%q3L>4bfp-gYKjDFEw_@naZS)+7w5(w)#tjBP#?^XOF@Ma9f6?%OKOmwc^b*1!fU~57-*uX^<+#Sjt znOwT5SaO9YHjuz9F`EPuiRqN#g;gMt?s|V;L2s^B^lYg0oY^!8`|K2;hFCs&j&(d! zgIG_L+~a1|8BltrFy7V%l%8*(2wacCPi(56&BB3MH9)fxern(!%4`%peHDQvw} zup__QN@^@hv}27oHJ;zvTltD2n3u;e)c|&402>uzZ>j8Ylo(&j;L^o_hn_du8gGxp zHfsks>O?+q`b_xzDux(`V&BQ#q`=5LFRfjaXAj`vKaZTVi@3vU1pMe|X|~?gxR~k$ zPNJ`=FP7;b8!yW06fKTRair*rPde1 z_u=K*`$)sNC7xwzn%IKKFEt4K3m}-Le-v6V=z+=ANPjIz;l_$m-VznWeg=lz{9M8o zTyIgo19{zAuUTH2Tl?%iN(y>ydP3cs&td~OBf!gYYk59)XVX?{7#9e{tujVd7p4HM zE;`6n!{{OogTdpQ(ci_Qs<5S7h@;1tEC8%LJ?L%ls{j{PdScZv{t7@-TfKG)e(-a| z4%hFu002M$Nkl#}+d>i*g}-_xUBFqA&XA)Y19P3I=7 z;l3@|NL*g}n*&^$%K^9)$H>_$j4@vJds?vTWUhrvC`V55J_4vOCXL1?jk6jdYRLC~ zcN>ji;d@dro?X2LyVl5co#%`W-;xAW*RvS3Oe`Q{x~Ytpj-4CDHQ@c+zF(uqas!I!|*bsW}n*oT9)!h`=DQ3-D> zfpDx={f2d{V_`kt`0D7_yCnhjHzn1<-A-56aahmc{%+szM)_S`mK&XWv%lRHfa_*& zcCXG0CrZ&Mt-8_8ko)%P$qy&9b8mu zfmX6W5dfuQI!}3r$~Rr3W8v}T&#z3U z9E=Yf(;HqwiXC3qC93lAF1x_TIlV@6X&HOWSKO13I?#TW-e|>u72r&Qt(IB~@l#pu}QH zzzi~8_RFxxWayw5c*Pu$J4rEV6}O{X!O?4R7+YmKJ~wY8GmCZzWi4j7wi|aXt2t){ zu4ZDqa7|qtvNZQ<=-+C2K#(H$ad6-!W#j@0|8T8b*~Hhc1#AF_l2qz43s1S_y{?yV zkzFi>6(o7vzkl6oVvF(pQqqg16skSM{sQFkit`_XI=gh4>pDo~SuKh*7wZLj zU|_)A0IO_r1N`)pPuY$gJFG!|;sJ;!U?3enbkKhBKYnIsFOFDS&qk}#))wYwY;tNE zH+wZZ5AiJpu+)%@SswZ2d8k|*wiK4m$wU^=s}bfDV?`t5LBlA0cg(7DQz(LE5aMtU zf3dDc6R7^Z0qg2++F1dXRg!k86vpccduolgngk?E(k9{(G)d1@hLyNDMc*k(j`YzK zKrjGTssVtj34p5wh8ciqs(@=KKwFJFD#I0t`jC=KEYw5>$Efr(8ZbZvOh@ty@PezZ zxgrC75z9*~Gh%81a?KBo2JINRCsBCknqZ~VH*;99XL$xa{{qiEM!c@6Y23d8yip}V zQgaJG*AGRz2T%gEL$wt#tjcp^ws8JSV!I6cF}V=S^*ree#~5QU2c3PiG<3vDr$2K5 zEZIbmc?=aYD>pO5F{1!>)nIg0VJ?+nfK?ql0c5W$v@efBdIjnGCD1N>?r-XOH1^atXY0w0 zFY~Y0kvj0@O8TZs7~S_iNx+9_>b%T4>EvYD-al2rzzQz|ST9^WJZY!*AF|rwq-C4h zt=O=}nxFiSmg?9*^GVWNE-SI`Q*rPAZRo32;<%PZj#}~JL965&?GS+d{BORn=G6fI z4V_kHy&zWG#*U=D)R(apjpzmttaqh5=u6TsNZ&9@Y)~2U%H7}sZk?5?jMXy-e$E(s z!3zD~v2@3JOR>101fcxg@p)Sq!f>x?J%(W8W{cx?@!T2v)zANjT|9r*o_qd9+q7}L zb#=lx^)>WkP>=V&(|FpytuAf=`1fgZ}0|NFSU#sC?=vJRXj0fto!0_40oC)EMT$ zw29?skf&b21zYHPoxA+}FqiON*mnEl3J}vV0UEkiSLrY6dS`4Yu9(gV%Oo&O_t8mW zbmdX1$@QWDJjEFki)|l@wcpH7*$@`wVs*V3%i4EPa<1qje$*?kSPhm^nfr;2qOn&% zVxTyLWhDgwvYiFglAGEu_w938x8Yy78+UcB7&%Nco}ZhWwMp1IOE6+m4c*qeVx>L3 zbC+%E?X^zM8=V-p&kyW}5e1m>!c!K5SsTM@HqNcWXW=PsKGn-8wjf%EuU6vC=XB+n zVI>Jz?S>%$lTaXrYf{29>-PqwakipYkbVoV4bQuJuj`c5_F%}xcl5*R+Te#=_WtSe zAN7|@iwdqSQ;yCwu8guN+kWA^y@w3<9z0}6PYl@6GZ$=dd>a4HjUEF+EITP|o_+RN zXI?2*=79qT?C<~n?*ovs?&4QKrRH`idNdbnzLX2%k3Ray0WQTo)V#lQ*G}ue#jkqo z#Q3BQGJhY&P3609zhy&w-}UW0*TYVsHfLt%?C6oBR#j}ZJaPDlqnD?S8UTSB@hh4~ zv6lzrYJxr3oCZ`P_FGIbYXnLGjMi9uUaC;qbtu*j$&D?v=5|S`?JK!#ITMy+f_QOK zgnPU!#ss+(EaI|IE(I&NN{x%XMR}4r;%+tKny?ur8?4eKU~Lj$Dbaw!obq`Y!u-Q~ zFlJSk7O8i}FK$-_d@A9tFquISr}p5TQ72y`alXo=IAA4Wcr8xB*h!%r({piM2KmQZ zXJMx;5u=dymqMnw1ThWMHpDgxrE8S3O9o1k%ktv+!RXI}BLUTu+ND5I=Ac@Qb*mU# z6X%FEHv!P37-k)~)$4V}h8RAY1axkUaheIu6~AR%>nhGvyb!p=sxYQk^&6mx*h>{$ zdsT7&>%bSsFE$lRcNCUY34!Fa0C&Nb64yXe7@-_<1%fX5scXYLB$ z6LgBZBnn_CL!a+|(j4lHV(L9$qw+nhgZp2c=#Jl@1nNUIOW~@`!NNT|ykL8d z&Dh91hDiy4t|O;y_WXG~8(=UoORV8-Ph0c)mlzKU%oB32`zXJ^YJBoZ(RTv$6i;*> zm&NBU4B2SroMmTlJKE8R@r>eeqYFSByH=&G69)tC;UUQ3wrf~=2k8>D<~eunoK4|s zIY=1l!RD&WPxyGPu~tcp>N#Ry9>jX5JcF{VW2+Tl(=T2);A8vQGpB7HhOX8hDb^UB zZO!OPa+E!Mn+S4`{zekGn-Yi=wRcmRQC^V*A_+W7643Z4{f1&>DJgW3=Kf3X(*FMN zC_VArf0j$SsJox_z0Wat0SgqI0-&S}Q~V9NF#5wk{6iCKYb`FS6vs-9<#v2a>mFih zDSnn%Veh{Cu3flr;gW()N;ch3`Og#gL@tsPyj3m?Lt3`ZQ4lvN-op4>_g*^D9U=)t z61XV|=$%z81G#s*j-n|XYdlES)tO2o0NW#$2hO@;(m_dAKR4Wmm&z?z48@>;h#2e( z1_r-3_S`m09-k2FqHGf=#B@)& z80_H%xfQo%%0J8Zeq6vQrj}wdDF+AXxSwR{KnVNbUvR!yT>`W|LUFPOS64@IiM1Xj z>F?npZd;Xr)RZfi2V?;xDWcq0P;5P{SZ_fhH!16ptMU!3Tt{(}7QE<>ah_zOg~A+c zT$M8io2jQ~tv&P9Q?{{>VB3ITc?Hnr+}ivs^$KVpV3WFy0c6CaEx2^Q`fYD{r$XQI zMPGk`@>Dylx20=ea0mBRA0ZZ*WkPvh>kg89ki=M!$FK@@vWT*$f#B;;Jomh<+q{(k z)6;H{qCoW*P?nv+Amt$Q_pg5SEBoU={$u--Klu}nM=7_$fAJT8;jV>$_OqYad+)tx zPdxF&CF2sYs)vV%eeT!qnwx+8qaWEDzyJHp|C_uZ-m}mwO%Qith;t`Khiwekgr^RD z34nyFy{0ysnVzz@|MCB_&YdXPy&3?NB)S}cKL-q{9Wg=0dU1(fk~n7adR3j3FVwMV8C%?`>6MLJ@`{eOpYk$|AA8 zVE83rE+(@8U*4oC2V>FI$&aAtsuVHanT7S0P@Fs5RG=`c%oi;)JOPXByrox-SdQn& zw5_t1bdzilQIHM=Ko#>-1@?d{R{)6vV&vg&2pP9k`!#?pu?ZE6E2WrI4KyqP zDjH9{OKAMo_(gxh*ufhLc~zPB1SYHfYHas5?H73K{O06!(|1-mgZC7FCOz4MRCEne z6i6;5LAE#*(^B7o-j!xJ(bLGOh^DuXZ zthjK|io-_%x8^O~wcQ#wf7fzdTNpQ37d+CyRw%@vFRMSNn!Bud=MU*8-8Osl9l$;2 zQ`V{}V(ul=St~P^X`Sm#cl9wJ;}BDr)otvxc9yn1&E+#h!0 zl1e~QE7vz-c`o*t@(Z3yf2F85kF#_dYh5wTl-f{8cGa+~=M=f{Q(lUXRevf!NB0a$ z>mR%f!6%ey^*fv;j==>$u0ishrEJPapql`-lPD0<6QhyB>_2aa#)o{T>Gd(&rB1B5q^h@X`w}*t*_cUg)uG1pt@^@F?k7^vJ&P zM|H;iTmaz>Z+9;t-is8LwJy(V-r`Q~eWN~7zuDy{3)+qBfafq{j%V|>dTqhhQJ++S z16+!+b(jU4j6uYZ7V}z$Aicf4?vilz>eaS+^Jd?~@KRhZ?KRhHai=-=*s)`F0OoeM z5Zs7+!fo5P`&wXnX4ZqS&ny&in}-sf7MY?PVmpbol_EAq66Mh1?2HZI4so)SvN_m% zZEI&Oi`yYFwQ~SV?XZ!$T5x9wlc`e8Sh*nulPgENqOJ2haVhsMKlmlFUv8O~4lVn@ z1wsJne*z5zHYbV2Cjcrn0|1qqbC-nWBKgzo5`bMv0>LL6bFj7w0821hS~_6XwGsED z4sdDwQ5y)$qPnIZ#ZXozR7RB86|A*WxaLfAk0OjLfoSohm~1Gst{T5CH6t#qELLnO z24fDut-MgO;`9Q{$1%#8vHaMy_eHr2ZR}tS!IHckCR{U&vkdY}01OKltJ0yoh++Ab zNhA9BO-Nu_djV{!ux72mtg6VB;LOOS7+R^qO8Rf3yVetHt1>%cC0rJkiIJ#SG;%|z zW|smKQSxTTSX#kQL!g-eDsSVsH;mJ7#9#{MJU^R18n240)Lat8 zLUh-J8aysFa9#fpB=x;3(u33ikSDQwDlk4&U;f@h{Rr6d7-9@Qde4#~UBmyirjN_u zy?%d?p6v>uM_+D20$NkWsc5~&9zS}-&K^BuCFW)u1@&^dM2XwgetpfJ+rF-;}E0 zQ>RYZKmOxC`od4ZmRuXPVdXD6pB87g^TMV4wZPN$0?^K5Wv)e~QeR)6#{tnj1YSw$ z_St8j`6l2?7U*)Jq!$DMV(-8IzMmI0#A`Rg=x8K?2SWmS?bKV~HIkGzj0rbNx1`t6 zt^5K$_-)A>r9u%PKn|E*$~IXu%D(?OKMrVBc3`RtrC**GY=K+Hv1%XWg?gUP0=~w1 zVVw~;gCZ>tFeRp!m|p_3<~TM(9{sov`xdT}98!`})=_zk^}NY?ctt7DXcGq?ABd1S`W*g`ludZ4j4ysHTc zId)6U6pvIP*-$U(#*Y#r(kBg3bV~#1>1I2^QDU#;MIp=*rqV;#^I7+mxP#EKYM&)t z_e*#XCt~OjX_0-!(gSnOS6ST&q%@Sz>QYL@pYVf`gi+w;40GWRk_ZgY@vgKLCp}wP z@v{-NUa32v%xCA{$d=j*!`<>tJ%{gK+layK`oJ-Ce^{Nc9+`z0QOSwIIvFfR(Dk2p zV{yk8`R%y+b#!3k>8`ok#_s~rZ|nN#eKE(8e$s(fCjQVyoI}LH_CmSZ9F1-RX-g`& z=joyP?Wua5Zr`i>4OY9`rI?di;91|r&Tq6#ZhZjp*n~37Yck@HX$E2_XQj@*Iki@+ z_m{`&kCvUyTDRFs6B!8BG3v9K4UAf%At>=EUt%?1v`USskr?POkaY9S?{xU>cm{L` zi#i>$!$xjYp)%MIKGm=BdunG9^*)4cI1a?d4eX6?c?NC0vLcM&_EQ^Fd{9r&h*(-? z(ELk2qtJQ9x?j2W(dtQAkk8KHCwcy65ny^2l8+i#F4$-u;lVU@2x!^Cp|IWUI3Xi29V2mUx{DcpV5;sTd@yRw~zh07-3B`#mG>$E`4?bhV1W#ZL+r$oek znYNvbyFMRM=NTWCD5Ejr13?4?{v8c>*IJjIP3vrnQkyj51Q`Zqs*CP+!-;tD?B(Gt znWP6ju1Ivl8ryQx&b>|fv$3brC%#=%6Nk}oqhcF}3;&7i*LfYBQC`Xkt%?sA@Me=4 zjor`f-Pc^#7`_*<>Uq*Jxm}f9q6z<*c>YIA@}dGBmF&gJZxb0el(*^*r270^{ncCP ztj5}T6ZbMh{t`=UZzYF$+<7J!Mz#Sam+=RoiAGfZ;-g;rS$B-r_6TvBYHfUXA+-|L zqi0$xW*mRF9 zhJ381$$+AMjS0Q277cAfek2H%IW>G87)}0K$3Gt70dtGNF-AUNi}<(pR`L}VEcEku zN&Sh?LKK&3uuEy=t&;)}%h91^NgD`mivc4cQxL;yj9sib4r%=Q;EB5 zZ=Gvn;cU0Ts1zNoWefDAABPhDjHeQF$-Q9*-V>eF$2J**dgwga={$C|YLW7j{m1;? zd!a9LBApgqBAZqc{)zYw#Y>$pNMlV6+PU>>X`^hpZBI62`W5`{WcEcfM4qnN4p(_{ zS$too?{?K>+_c+V5R%mEnVsD*pNlh}F+&*D>kt6x2%_tP+R@8uFdjefycxxiaQfL1 zn-#YX0c}KS%p1H$ND$2M(n5D_M-v8w??v<|P7zU?J5kL3;E9Lj0Y_p}Ip)A0ph%Q% zpNl1tGUn+J67#Chy>~F#>!OTg#}I<9L64BURYA$`zGx z4<(*+SU18?@|@0PVJxXe$ohkcP{nF73tG?!GzS934Hy870Re&aMb6w#(ShIRE2C)# z0p@y#+3*QS4a!2kTn^(Htk0)uhe7HH6o2;BNW9}dE^@YQHyV&N*O;BOeq2BOTRrj@ z_!mnJ#SsVU1OqB=m}P3mXIrZikm4H$@AQ}(KPljJ z$rc4;>snHxO$J7bI8|<^>FiHz;CS_15_H92Wm0&o>JRNJ*=2rO$AbOlF12N0{K+TT3Eis!FuANSj8sOrBLHt z?63XPEl=qe84<>tfCLS#Y?+zcqvGr~_Gx-luYH@GcB{gDZS_^D(wPHI5yqEGVtWW7ymckM;6akIMVV5-5|)aatbZ{X*6D?GZ{X7a`p$68G^m z({01SO>(Wt#;M$Ky}Z4B?F*A;bon-tqSx!=;Y$kBc+Ae3lt<}hnXGbC*?6ww`BP!2 zZ`i+Lb!~$G5V@cIiu4$+0U9?R>%_^XPKu*qIqZ_9BNv@0NIxF@+&B=|gp{lgQ+cBk zS*=3H?1HX$yXhwof^|)98hnDA5Wi_>e%-PELou>iaLM#{b2|Q&sc^HtM;naE5`7h) zVrB?+k%qQ1TbfJQj6^H4?7)iqq8jYa-x9g=P-QvYx5RbU?gMh2e7PwaO!@s4I80g( zDReJ)$~Wf4Vl$-@CU$Q8!bC|R1=Q(OD2V64n>y+crm8P!pb^KGAJ5iT>E^IYM${#L zF#SN9{Y=;Q(ZuV0qO);yoZaw!wlNa{#pXXGb1-Pun?}97?*+SY8i*7QHIR1WamdyR z6%UHL?T-FIjWZMJ)ZPT81y&-!AZ+!%|;*LUKD(W{z+O)imH7V*p+ z4*S8GmJQxhb2UX;vXP0coL(zkHJ_7?QAUfMx=`~TWT>*H}4NAnaJ|sG9k98rDir`$@DS{9`d~2uct)nVnfDwX1N~5y>=)tVnFXxz##RYKH{eeu zymx#Hj-bUD#AzMu#c)+dZ;I#uwWNDg4pK98*te0h3bfHx5i3ou%l$2pzAYS4vxSF0 z)-<3tkMM`ON7kguZJjaVgHJmY3p2m0%)vQ>S1bOI1QG}HebkDb6N@dhoIrg%dkxy7 zR%FGwTZP$Qi>un|&mtz=;?@H`#i!j0*^Mw~ z{_w^H1M>$jBbzqA)PF38Yo^fKxK~XJ#G(S0Dz!m$BL(f>V+qJ%>4n)AJc{9GybIjE zxAv!Ir<+(Kz*!vE7One9c@H+Cei)Y+r_vCIyL~EAXStfz$a$tNLhD?FBrElMY*YzLXo95x6 z6=o1Arp!Spcs6F4{|YegN7o_Qzq@@Y$Ugs`s4@{=E2t;23+g>_I_vkR17Gx?!of5>4 z8%1dWaz8ijXck2uJA8RD^C}js)qRq13d&J*`uGiGI3}Ebik}8-Q{P$ zvWJe-rN{7@c$|ElCo`o*uj{!d!s0p)62%_xEi)^hT4;RhcAk@ZB<7F^COXGV#Gx^*$g2Omx;6_x#4=cn(!;vp@ z7$gA1;QCat*J-o3Ao+@9V1W7NeriP32*Xs=>faIi6rIzWUo{0X)ip9e>h4v-wbMcq z8#Th|t{J?1|Iyx13kpS_-ZEx?)H=wJTrPyF@G;X1Nh4xPt@+N?Y?LYDytm zd&vdn+8Z&+_*75c_tZJADA?7qB$b7+*kpDf8(o%v;t53Pkp7fn8i8ym7CMLk1?uF1 zU(<7XFZA>=oz&esUa!~J*7GBe?1-EOoJ+Ryc)tH5VDBd3UDJO53By{xOwfM}j!6TU zVtAtp;9-pPtH(C8*-X~cV2G|oGpguN`^@>x%6oB{neZ51r?-X`i&({{wXksl?d8v` zIywlW0+9EEIobbM^|s{RfLKNry3f$C{Y4U|uAuO>R+!S-i8^aI8J%b$%5H+Y?ABO#Na^U1 z=i7QyJu@~6X{S`xQx#!YGANMS8XC(RA?(6UG6qX-@mFL&%^nzryUDN zrh;Vdt9IoUVgfC|6u9tcXCclW)07MYP_1`6o1+?@^MR7_UU3-*yl_L?TzW ziA7U_*=suekq%QPwB#K}+}sZ#_xK zzl;`rO#&)3Ye($Gfv?~#=fOX{MVt0&`v8KbwkB?boI#I{QDTFkmwlc0t?D=j;V3js zONGgf>lf&8U`pgYhCGTCQKcF?i%DV4v|5yFy180BKhrhW9lK6bp_g>Ufw0U*bBocK zvcdJ5L3)Kq3Gql?thn-_wULr7bcQ`)-7-%sf>O`9k7vUoueGq6bkXWH{GxJs~)p7X86{@Hk4%*)} z5e?4=B2PjKL)?Zeo*S|JEW5%M}v?j1b6T-F8chAnlM4+$;$~#U;bCz>Y8Ar zz#lN6(~0|bU!-^1yarNs+VDl=N93jQ#t{5diKaU>e7KEBjuD2ASZrjTy0!_h=be=x zwB|w;$I+&PjgUJdBz3-%zf~08t6T^l0%YlNNVDHj*G1Y@3jNF9qzm0?kI_anb=hU! z-c>d)&@Jp^sX0MEvYyYW#7DLcpVlkfYasn)!HTEH<+T_{|^3T^UScZ9*Lam8Y7E z#OYl&AaTh+_P{Sn{z_ECI3Z)hXnV2Rjqw_pTKHSIlmd1yt?cRKLMHE`*IPK_0p41N zO~@(ar65p+@ZjpIuVU&Doy<`#?A{+9@&PT2ykSc7oUB|csm5CF9MUbm-q@z`j!#6Kp3CKk2p8c&o6CLf*1Axi1-|$3IOr0ly??9SAhC;79g(J49$C_(M`1P`H1)nPZJ0$&rGaRT0b*roy zI6$k3RU`n&QsWg>#4c-C)uz33<9iM@yv>BvEuw|DBzBU7iPI^44xQe?`B_CBi6j`s z!hEbMmcL-id9AYhYL*4qEhC(+7bDwixf718F1Ncsu8D#v!C^|lT0%7HK#4#6XG=dh zb|D0KS#$ActBMtsWQkE6d#NYq^CI0cp$y~eEDXNObSAw0*M7h)dmK@gF%{ddzuSnL z+1gv|T%AWvLxxX39!>&(9tG(*h@yT&o~c7~M0fu(yWTR=BT7%?rh|$B$+nLz;!{TH zvsWq}%sx=A1U8J!K}4dx$Ob$9{=J^cBwcUKLxJ~RJ$$w90_2yEF=yTUB7_|8AQp?bMm37n zMAyiIMSM0ME^ifuU#S>e+vyp^)r1u<<+FvpNUB@}TKNRe3GWuHhD8&ULd}Jv&R%Qv zrx+>0h#d&N2}r9rZe>M@AYLlU+ za8Wzcjh4m+8@VYVxLo>DuuOdjF+h9u`&--~B<$WBJnm{!JAPc5q$Qoc1up>X!BuDK z{xtf`iOv04NIy0Hu;L{GmOHYm%V>cg3Ink3s3Fe|&9`-q_7?aDS0~5yn7O(6oLGcX|XIMEjz&w==I7WdfRfAzp z!nXfxjaF`u0{kkp6Cv`Om{q7?=^AB+>KTXsI5wNC~gpPsrLEOJii7s>^NgdU&LvG*g;@28!)Tx@+Y3;Qke zw{c0=X^Y{j>B1kJ8&$MZg|{1pPNlN#(hSQ#lr_{jvL;Hc31?D|F07Wqqn!Vegm&^U zy~IU~35M`E6Rd(3sZpJaLt|!H&BH8iPRdj)YLH!JX`7s6nE=&r73ySvm}ckieoFnd z%nJNO1(@%}QmfaR38QFc@|upD_;>WSoATJ@CDR**3LKM_dT3TbwH0DrC>q%^t@vgg zpbHM+$q3h-mrYF*!|}yI`TLs`8z(LGCoNk848`XgiNJI(u` zK@z>43(k89qy-X2kNlFjF0L5q=lkwk0`LC2X8+xusdWpDpjTT;;}U9$-(0jiZl(bn zWs10w?PL0*9PM3F`D>}rS=X@9o_&A3@QqZ~us`z{Hnq5Sl+=L#8uv_1-*On;9g*iZ zgRI?ksJ4QR0K7>u8)gr$(nwp@z@`$v8x#;}E{#XD@qT`1!JkdEuOTXQK!=F&y!)hh zH-@Uu9roX;qQQsYM>b+6MKy@4Tcw3yg)ZvM+KUxk6GLx^Xu5`5S-y zcC)l53&PLGI7^VZ9@tGwYnOV&fnjz}O-m z5+pYuT)Qmq8$kInut~d!u}Unwi&^T|*GNa`<@B80f?!;XT5=|C1%cZ3QJXS7F@~RY zqUBt8WG>M5bGt;>w2Ao6UOIUlhMqe_h1rvmaJE#Uwkgx(RtnWd%$RN8B=>U zpE7g(^9M`bT8b=vzV%tLiIXmQWzf#l7*R3F=ktuECq!inIBM8vdT!^ZFL(cxmpt=D4B zk!mCgg3ar^q#6t_<7Bj!gXMq>-AK~aPhO2T=C$UQA^9`CngGgaquK8r>(RLCYlCx< zQ#Auc_gfUI#)u=94{FEE-C9h6B3-jwe5(z<;|> z7nXFJ&)?d~TW2sKQ2nZC{wp*%l9&Jg^@Pz5C-$vfirW!`$zSGMlc5e0%C9p$f&mo; zq5W;_g6kzB8FznwHjj*W{Ivb7^_%vN0i+%*UkY(upmrYyoGucZm5q&yJ#?x2wUPKW zI5(z&`?~en0RO~??u`fCp1GRNNB31Hv-v^Ip}77C^&T=coOEB*YdI1|KM&j#-Ge?L|E3E zo8#mjKEHIvL$OGZ1+avDKB0wFGn1{EMR3M*dmK{$w;X;q@j}m*cjz1kG?=2Z4+PGF z9A;F@8S4fvGzJclFXkl{Uya}fa=rW_a^bO~w9w#r;s_u1hWKKqX*i1u73GWH~ z2Fvcaw2i}*89>`pg#6N(SIWY@z`;X0&gFuz(WO|*CV9?g78Whbu&4(Lq`h2+9JpoG zj6su?J(4|+(XzVV>y%dcpI>Id%AZj4?qeZ=`zwfj0!p*RtrONYX@B$~e`}b)oGdun8j)+wvbe zVB$}b_mN(}UDH6xQ@*qJ6p4)?pnh=OTF4n>iB7U+Svk}9ZfspD!Xj-kE5exEl|!)N zB+OX%X5BUJ;1B)XR@2gx!IYm`QCLsF2RQiR)LdB0$<3=%ABcFjl0@1rlynfTMv(PR zU-%LK&zbude!D1t{-tJJZAF?SHEtY86icFk2r7bj$6A_1Seb0yU! zg3`ltreGrbkV(EtKmHr8Ig3+71EC#Biaf>f1lF`C!t#hvB;#r9%K;Xb2toLw&df%&D4-EqX(bW!IS z)vQX2RpMNpuak;e=xVOJVxfSW)$H5zEP=D&v18HD4&wBv$D2+#ul^Y|AZmdX@vTTCITM zfe50L75v!@+z;F^R<`gGU)X*q&wFoHz=I^OWqq+qR8xNG1cHMkPY9L|+=bCU$IW<@ z+kJs^c{i9+TgM*XhiJD2%LlicyI*X01Y;?~@uCsYNop`Qyf*Q3OmLhoohSL1ZnQ|6 zf5KD@gfcKsuFZ$RHifD-^e|HoZhmM<_|duzz!z0>I4PJQ@j!&fqlohdGnFzrtCv8fL#-6*qaTGZ6n>94q1_A_PYT?{{#q&u#yCb0n4e{>c+I zX>(u@kSg9A&Wr(vVQUhyRdAOrSR~16m7{!v zN7Qdw0JM1*lN|?XLfx#?x^W`Iuv<(Ge7B%XfWFFO0@_&PCmEH&qu4dE_3W{Rh*_Ul zQ5}PbY3xTl4M2kjVi$mfovEZx>K`mxu+_&lR+A0^o)5&DJ~}J}X3>9F3BjI=f7{IT ztvZpNc8t;?&z$Nc5xuFWs|P%;`Y{OfMP_LF&EJMG|Kz6_pUHnW6WXh5ZTeZ*kX&fq zm-vVj`Q9eM{yQaQy#j`0YgP)^KfqzC6nGEKJ(4SpNi!?LXPRh9RfRZAe3>6{JF*^IbU4Z+jNcC)YmQ+18DgP@0$-T&v|T zK1Mg+2T#xQ)Bc=K9^Wk3zfg9HfNy&u`Gmg#($t3$E53D0VQ$vs@sYr?DBP4D!}n1} z?vfG0R>46Nna=uD2#Ef1S1`c&c;{3T9q^^Hr45=@C*u`UD8QqIoE+Q5t$z?1n|v^( zEko2^0)>n+FHS#qwCmy!+id^E=XSbCHpboKW#=}0zVkI@Mk9Q`P=05isk6eg*hMb73zf`ou~dYrSWvsNs)lgNttQe0Pe@E#3WT>v%!^-776<$HcZm4_s~D@EkL; zJ=^Twy#DZuI>rg6bx%jissghGIaQlq36M4-_%C@DXyj->$0WAo=Iq>}D~}-6rk-HS z6!45-U;0rsceSqofoeYyZ+82KR!(dW&0_%$nj%ZsPuEdLZ8Yi2ny06yzuu~KRSU23 zaic|bbpK@h`B~k0mnQUlQom6$AL{HkxE4p<+Eb$l#OJCLi1l=~`S$~n{Amk$L*IJ7 z;r3Q#Y2V>SnN08c%XRLR-0oR55VJeImdQ8=k8pF(a43Kw^Xr`h&L3PRwGgC_eouYy z;PP=oC4Y!#{RoQBJ|3+`Vv1&u&jYLd3x(0WvQRcKp%kWNFUvm3@#Z3~lXKmC&0`xs z0_4!;>>YePWn|zNw+zI$41l*lP?Ya&va;5qYiRh)SFdiLTVecJe)EXri<(kf432G}Lt{|_WSwVDd`qW&s0hy++C#}f-RkW4j z9WQk>A3$H2=vR}7x*$L`^N7LNcrtA9ZdUmi?CaAC6W84&3#cvRAGBToVT~pj=kGzL zTg6S^brW%qhQnr3{gkbYaYA9y?FaO%j?K9&D|FM|<+41As^s@SlG;9KZ=88@Taf+~ zw&eL~H-Jp#Q>7vN{U|`2bKo__U&zJ5G^~XW#4X$|)q!?PP5+za5Zn9P%JKf96^@sc#h=i6 zY8)emDqiPtE(ZWf?aC}E6t+2PVAa86+GAjqE-Kq4*euaOV#!$jMqo}QsA}Ob*XtQ@ z&*vt@V`NC;s%JZ4o7LLm3Fy%oCXv0TU7CCLV>jJ(NVufi!>*BKB*;#XjL~$#gYW45 zCI0%M$0Zwjfo_Lil{z3l$vIV|scj)YvJbRK0qsN{E~pecK>19r1E1MjM*22v>fm1J ziXK5nN<`v6Xpvu^Rw*+Yo#_Y!NTtjY%Rl9(av*SksA#RXA^5L+=+}(vO_Qkwst_yn z2&bD;>K(@qMvRh?tUF%6Rm->oz$_s0K;wk|zvKLr{d|oyJ3o;h;&LO5Pxdd@HulJ$ zc$NlRgk$aMKUq)ws)Yh>KeNk({Vq9-3z+_tg^hl)W|e6JuiaR;8_z3z z{V({{1IrAoboty(Z`?-@!5SURvHyoOdGbq30IDs#;P1?OXN5l2f@;hjmp{{#*e!)l z+;$t*?XIU+KJUneSN@Dgnm}TVJ!UIo!b}x_d7JD?k;*OT3a8kL`DJJ*%u*r&OO;@P;6K|k_QHVv|9{m3Nf zD&V!QhbA8-XN$2=GO!m{CxfPdrXHnTg|yJ(T-8J;@jk7*JH^q|Ir#JY=VNXe+qax0 zxfygYSQaD;Eye8fJUV%f4`k)OLt>f^*@A(EEbQ&3lEW40$?MD-Id`yvT%cZuh`}V3 zMAXqLN^rh6An@Rm|Kewv`VTlEj!ORk*SPIt4iyu;@zuUGCs^JZ7Pi{{aDofo#vBS@ zeOVkIdlWRfRJxMM_l6o~Y)p6mUafJR$rGLOXg)wnmb*F30#Sfz!9G+IooNw?4ZMR& zzy8|=kTsnqswOwpeeolcoT#y1GG@iA+hn%&=k z&YH$0-`j&Xv$xZ?7rz`v+|w`}fxuh2<&chqTM^5Wv3NI5^kZHh%m!rFQ1B0=78z}> z->YKd%&YCN;A1nG20$|;GdIEfxV=qn)M(255$!k|`l6!m96QOcUbgH`3gPDxwlf<# zuy#*)AO$GGG^=Kel^z(0W^hzmj;)1@4XxVePivSnirVl^IZ^dNU}qKjBy?zm64=lNJ+sPMWK65ObK zcSJKtSf?Cq6KV*V`@5iEUN|lQ(^>$*byvwEtX;|Pc3CvLt|HI()jqcS&sJ`Zx#BonI9u;DSa)Rz!k$e-*6ogik?J$63?&;;aUqG zqG)9_)}g4W;b0$s@Bp~|D#x6#MT3bniAhT!i#aTvMKlJeR&}3`dW}Z7^R9F~)3>t; zn%cdrb+4=uc*tU$IGEEa{OuYKkJ{kD={~KMdT+|@*94am>*pDPS@n<32Bb-97U16qUYfjbB44xM0sqKJnc0-9g4 zK8ny3e`&l72ax04Wu}JbjcRLtrQx(nn&6=*1k!_eHl+GkI#sNtzIJo+bApWDT<$Tl z(a@)A8m-QFiT^YS&C|9t=YKEv_tWz#BMS99dMFf`#e)HV-1L4&s$7BjcCEOm>_7uV zjviGoOMuGm?rv4S`|W}{X+I_kqp>a0^)D82epI0TQx&gHw$EK^i1e)8tWJOZOHX4(Kz zhY;m!E0!1#<;W)ybQM$c&=fV0gm%nxGn#cdFzZTVfRSuDD(>A8r7rp;amTxO0n-fk zjkL$pg+!lm;vA-QRSDf33JhKTkynvu#97nClJ{xGC;WY%#C@pbGF)hwL{SI+N(^W5 z0AF<>xGpjBH!+WOL!(b;OB5`VepT3zdG!y;9fg(_6#S6WQ=9QIoyEnV@-GDP*?w(@ zaac{fB1X87!$Au~^N_!f*p9_PL9LMJR$^{;eBA3F3D)Md;6p7O7stUMyUnI@2u2keTR*C^COzYFKiv7 zEdmu-)#b7$^$ZmJU1&!)Fh`b27B)3kdo3pRxb&E9z@^|QfG*!1l4unan3g<-<A-b_6_+Ysui%CN+s>j6Fu;LMnj zQ^B|C!3T!$A;E$4Q{ot$Q{|#H;qSt64zoVHN*v`T08|x_6NH`;B!1`JZ=#E)iFqZT zia3u$JHNis$z?QRok*HV!bHPK+dL|fg59}qK|?`TeKm;&!m2{Pw86yJk)$KysETIB zl*vq0fWQ<#e~po^>_ARN?)R1xc~G3m#XwnFkn{yTQRpUm7} z{x$xX6|)&Mfm%TzEE>wpKyCxft50*YvxY)K1Z}ZmCt~gaQv6r{&{l|xCi`NKftCY$ zI7snbG25sFy&q~|!SB@fWk(R#NT~7s*?N=1?zdqYG1rt)XJ((IML5bPtck%dD(#1W zWIU0wudS~t6{xMaSQ-V$iY6twKSPUqSOa9WKL1;U+T{D<>9rF^OQNB?k7V7ZyN?j# zZe%4L$nZ|B}5Yh--`yIjU?4!n*o-wErzOYUmifZe-(f%Qu~eJ_($s+ zO;zyo$DgKPSeNOCjM(Mj43Yj>3)wLy8Cv-meuZ=wPltM-)DZNZzCfG|<;pRa+Wuji z^+*#2<%E}3pZ)PsCMFB6uhD-I-w?~Rp3jOBLAweVWG(c2RCCnOA-(`}_C5jpj&hL* zKxLpZI*$yZjJ^C6@KmMYmoiwvAA|>FIPz)v_bvcN z5~;}pz*z-yg&FV3Bm4VLqFz_YVy2V_7(`9?u=GXn`iaFX0Bg602LOEkS~q8BC~c#? zFS%?%AUczYy3PHv4sKN{;uZtYyHWUAPcS$+8F%`m>eDUZIqYiy>v&$II(ox3$rr>< zMz^OlSpp0=WDa#iu~H1wr8XHE-za>4gVZ~h7FyDV)d6G01FKAOQZIAroO{>S`l=5R za_a0iROJS4h!IkN!Ou$`9hF1qPrT6Rw%n+p66l@NxfMhprLtPP zE&Z|g3rB!!mc9YZ&vh2-JClGwlLh@Lbp!?+1dm4wewP16*1f{95iXyg z)oXJKA~t;l14;P7AIHDa!)^W@Q}z4%l2r%VES&m46VQ95%FzbZqc&IVV)*;+SY3|B z-6j)7$I-bxRdq5bZzXwaA@|PHXl47V!-p(EPQ_%Dih`+rx7o^PJIz?8(YD~mjafk#l(gL+%svPM~JsmKbKcHMP`GFo#yIij#)!ry)mN1MIETsPW4><-kF>v_uUiXMf}^=V*#Q)BVH4%R`kB@X|>R z+OnVDg%^y%`#&eD#prE{Z_7i^sn7O@|>BU`px zdsbWHe6e!a6=%XyS1u*3UzY8qh>!S+*am3*Bfe_Pj;8SO4^x)av>I!G;B9rXt-Ch) z58wP(x(o)ilux4Nu>=~-d9*;Ipc3IRCI2YRqy$PE>$A3113+xC+&N1A$yb z3tlt3I-dGMkz<36-G-IGjaEoz17_xlzIJxfjwRs ziB{tpcecZBX96@56fa@==XcrC)P8xlIZ3I)=Bts9)XQ<$OzblaQ16=Eh2z?DKeRIO zbXAN*a?ytK5a2E^5SqU%X91CoSfOoRjxj{Wk#1qfWg8TvN%oaC{C>QmGD3~k&-q^H zn55R-PIq%XpL3)#xn~HGHa75f5*~w_+CA9Y<2;$j^vth6CS}mK#r3w9HYV15>zN*s zVv>%WuogBT*0O9W6td_yi(b1ll4O_3ax%%fp~;mbUZ+v6SeII!vHR~uc|jo~>XgjQ z-Z;>re8PMRuYpv7g=9KcBzGn!Z;TJr4J7EeySw9$2aPkc*E&b_lwY)nks!g%u^Yg* zh19@h`t6N;5OBZ9@oI^e9hk+6mDD|HSX$NO{py}MiFB)B;L(WThyO*gCG4!w>Q>vm ztI7v5D+Jpj)+^HjQ~Y&FWq)i(GNG$R49*-0UbXNaDP=0r+(5g{=Z*V}b?Px{n{bSxVCJ_J?I!EiViPY2k?~E(zdy;lA4{KU-u+KF zJB^x_nkWHUNlY`<7ADNs9ZlBLQA7Dcm_mL$Q8VCaJSiWj4Y%gJFx zK7+)byCxE^p+&JR*(r3B;^{g{TC{Q|Rf3IlmXSxh$t>KZA7@Kug(GU>%$64EK{ca7 z;{%TvdjJT=qUL)Q9xRm3BBcPXnkBM#uMhsPta2b;tEM%G^*CIsq7r_Z38d|*zEa-K zz5I7R#mD1MO=j<`)tg!NYSOKhjfq#e;{X>eA8ZPtXjMf6uF+U%{q_qY=$yb`X`->4 zKM&8(E$$GM`~9*FL#2-GutVLVFe=R_tS!p=Xlhdor$3)0)O(% z1@BuTALIK=fAx%WQZ^1+OAu)^SedH=*mLH8hVjd2R&OY;Rz{>&1zo!&hqkE0>+7}I z_ap_QYj>T)gM=Q*m4bJNPHfk&k2xTBZr{*eK}y;Bx@sNbt%0cE?1kZ2wsY;Hom+PL zj?b$iyjb?GCVFlAh4iGqCt;_r~z;Y#y;{vUieawcd)CR`jU&ccAjLqp495iVn|dx`Dt!4%61cIXS@3IWr46!fF; z2R2J-p6xo1{rbgbexoUu{wCj7dgAv2stxaJv%A-4@|JBoJG*MAWSwSKGCPx&nIC5( z!8+G}9%Hd^whAzm6rcQ$U+y>E^g#n8!0%~mUC-<1t1-SeRQG!{_RtBQ&4%Vp-!{BmuJRBLj^s4sYJ4R z6n((Nn=DS#PE7K{Ak^VkAKrhI-`8xm%?t!T2?=hp`i{RsIQnS%V~qi88^)Z3Zxrz$Lr-%l*lqW*n!u?aCcMkzOnp%;0vnaICZh5?Doh}Q zsOQb>3thuxwI70+;6H2(m}7>6+#pOp#wLI2`9B__^G@i>)IgKbhI0a|xCSs`UJVOO z^ys>LQ!DAB>P%6LpDa@r7l6mA;wwq&<29nSfhUB9C4-xdOnYU)hKlJ&Io)_ju%wOt zRzc-B?Wvc*leMM6(1z!^I0(>+FkbiTNx#q>Og|E64YmdZ(r?vG%Nc z$*MyUedg8S{h+cHpyv)GGWKckY;oJV7U~!Ewqa>8p#*HaC!&j4XUPn>`o7BareKLn z4C8u5BopA=mjfNNNVa5PQd-li+bPs;aT|8gbyW{8D1g{SydE37L`a|Q2kSM=8~v#X zZzjw6Pj%>qZA^OI^Y)l{06oTJ_f-Q&#Mv3H=cJ8|NjAgDvt`o)gS24%76U)ou=&r*241tUQp!~rcGgrz z!G*QoJUUnHPH&!@`KRG4^or^^Ng81EALXp|EVnL5vO_s?tnKxYUk8qhDiI^cJ$=XI zTm8t7jQ&{uun;IwCp`S5Sv@9nIURI;ciBU~2$e|J1J^h>Q*kiN(NKd+#AiG|{@-kk zLA+=Q<7@|wKB%@iVUI=egf7+v&eLM8*)F@j5l#w;R#Ah>0KqdE*PMD>lsDjRR3Rtn zK!!RqzXKFz{xQ*0>Z0)Jv6#;VN> zpk7k*?i=5z^e*ptDpJG&s=B&_-$++V*!5n^c6~<}|A31^Zy$fF@#Mj<`jMf>IISHV*+bKi(_fs=X0j&yT%tat(3;t&hDSB zwR38MZ<648m`tZWnG8;cyOv6=IU^|dZQ$Jd2085Elm53nPw>7J&WxtmN z$-Aj@Kg0FZ6rqJMs0o0Q{r@rb6lugS)%C zySoN=3HFiu-hJy^{R7UKwPv5*Rb5?Gu+t11v5#xWw_PLsu4tEoT$@V&Hb-%bm7KX( zp{BmXzt4fSgMC#OrZ#BnvXQu_Yln@v# zkj#`lrOt-~D!xP74jGAd?)Q{-C70YuNmP7e%!Ss2oTK|$y(SA()o8gs@2)y_R1^ExIHyaV=E*Z-94%+^Ft_ z>FnI>W?whxMDUtwCX=txP38IB7Mw==ees|7mY{}E@_G4_7GQBV{T#0g8>og&zeQVy zq?UpsUZVSCrw)U#uG$NPD7ajCZb#K4FDbKDrE8s1BdZkwtEnrY?x!kNx8w^&0V~7K4v7xfl7xrExH0nsGS z?eP{wK+nEhQW3Qf)mn2Gw9A3G&+~n{a!Cg>!Ir{K-z{56Yq@@Ags7aOJHpM$xG$VS zl!KQoBu>DrxWVmYV~D@eren9?Iw|mUEo+$*c zdmqjqlO~LWA@P)p_=P!m%)&MRW*_o1ZNh=W4{i=t>(4m#>qX|A2Qv++kLraA8TAGo z$#vuO+BUAT@q;y012D4H6VmYTkc1eQdA^4Wt5vz@YH_-CREkGI_7Dsv^DqMC9~m3m z3p|K;3AQh@9vU=6qc>m2wKVNM@H`{UZ$d*?28}ApE+fWJDjpem2n1p3IT<}A>Pym% zxe;zT^+*d_6q9?c6dlA!supk@Yna}BSg}AQj>+w7T9SVkE)r!rV_$llo<#c<4+->iavJ~zr#75D97$VvlJQt&?{et_0Iu`H#mI7G3JrMt+= ze&PNn{J}5A{NK@GiOeEp`m(=HFG?_KyZ-q0dfE%a*>V$m!m`;RX3 zd5c0q2L!@gsM|U>RI7!a&P?XT_)7B=N?LR!#HkhahVjIK!z!;JCt>94mo@B?36fzk z-h4fMyC{rU>dsI$m~}eZPGg7PHF#j{`URW8n;6B1Xse4f$ z#(%FBXp)d=VwXz3GO4)zO*5{LRaiCBV@%C_s$rBN_843Rn+eHX4G!h4x-r-lKK037 zJ-dT3&&@p)w|YXW*Eg>RG22;QC=Sv?7%k8ha@fDaRd&&Lif`qhbd1_d35~R%TZ++3 zKEGclciuMXSnokL1|I-_ArpYzed_*aC%;RSBA_KuDqhIUXgXS`{w+)JsW>AAzmXMK zK=h-mJy6{4!!vVbKaOSFs2{nW?;OBP-u-g<2_Kj`Li~n&8+&>YyCg*JHhu;GA{wpGTPf4o_|@CWr>T51_&)PaP{DxhyIq& z4cw@KwhZ4mm_yOIar8ph8?zItaA&ZWjld(=oH2!aC~q`)xk+onZxdoDV$!K~tmS_l zX|%;>c{t5sW?0m$>L_2e&8=UK_MNh>RiWVUxa3q%?-k@ARh?X*Ir~NOQmx15c=>K| zG2Xe$Q{lC_?rf3?7YKlG$P`y5|1z3%Iuw0IIU!r4zi{Ux*w$LJ@cQ~j_O$(azV-~u z>+8{Ak1<-!XO+pIlt8PT4(AUIfpN3soVWR)5(V`Iq)aKLNZvnGuh8b1=1W;ul&X??JgH1w>-}l)WDD4NMdtd&j~AenguIy>bKlH-O(sYOrrdl zcnq_WJBCw*t&YM(PuEv{jFLl%N^IP(;P;Gp84;T~;vu%xUth#bHEdx0gNkZQLoz(6 zSvp0ii)Mh;*f)`>EN1iwj#NIF2}lc%=zxOmE5m)sQ0ZXrUT}r6rY3tfQ`?*yYX;+? z0o zRgEQbR>k}d_=Ff1bVi)j6+bPlJ$j5P&|%fw%ce@=q%~^2n|q85aBAxWk%OCXFSSfw zcV5}Fy_dbZOS4aCOvqN(@v86Y)!YO+CYToN=nm6k58o`!R|ZUl;^>$(^-bUf>VUob zqrPjrtp;6(=clJ|?+oLKFNnhqWi8e7f1mvf_57YhPwe6t3^c1W{GL?2UNrdY8$}OOhiJ~uZfowXn2Swtd_;pkoy%_R!Qk!%44pBMO-YJiC3@O zWis~tNIg+kogS0-#$Cc^DVJ3gv2shgL4HTpVioQ#S~9#sd0=)^S88c*yqmXx1tU*`F!%2nHW06y>l_Lw!Kg*PxkDT5 zT0Rhowa2sgJmBlzB zTWe@VRm;3JT=1+?)Pt)Kz#IkXE@Z_gdBTeo=a5y!)IXes=O~1`p^WZ9vio_TFM5uf zLUwzR{90nK#p$qfbOF*09PO0JnCd)YI2jDpQbbT?`O}fAD|E`f`mcNhh*^`1?86GV zk-g#k`ut&^^?|RXIe)4<%Wf+Y{E!=Ih$C*n*O>iHDH9yw?l2tN zAL3?0mm**n;Y@LF_m)16+@R$p8{cM*Euc13URZq;-Bm zQjJoI`&)^zH`LNTO)Z3#!{Mqe3JI0B_s99YIf1(Ss$;u}lY)fVoGMe6W6JZ2kipZs zlHrd;$uAuxW&s;33>skSCM8S@BR_?zv61I+0)w>@p+BigU+4;#)oX&-VwU3VH6 zK8U6L!R_^SNWa8F|Nm51vMhv)3E=C|TM(omMI|=+x|9;MJ%#u7)KqLQ1Q)6zq83&c z!V@NQMRoP(LnZMHPMll&bP|81wU{Vy(3yH${Jm1s;m0B-VJz$?2}@CT2Q;1(PvQd% zskBmwAj1H3(g+go%YgR3$E6cG;L#+;bC|9EeneD^it?3ljb`#pDn)3_=-7$g0ml{J z(uu~A@ymG+p!-La@xTOfKkh0B)*HM%cdjh$lYtd$PAxF+?!9f}=X1QBsZ0@RZ<1Uv zs;n&{N;A?AdW=FW@n;6EqNC-XOE0_^Gd-@QlMzd49T3sV%J|?k=@;QwVZ61O6^|$P zo9|Y@mCJ(frxp__q&e}IOgW^+fN&*AK0yoK3ihS92)TxiZ$V$^b+*KP?t=+t5Kq!3z7QKNcHPSr}Tqk11rMqMD}qlbXJZU&C)|4J&$Zgb|*w~2MqXg&~GHV+VyWffzgRXvOX z-V~4>t~l2U%J%*-7i=~;|MqIsCXq1vy-k#s>S|9ppT$EY38KQ#VY5tN1x=kGM32|g zi65|N{54hXUP&8glpXQdk@K4$mZx0!i^$jJ#y#{@oY=&;#wC#oL&W0T0%#{QXg6%= zx2GM@rI|{0-JJc^l1!bQ%k|r>WM^F)U%ivbVWP9_G<97!{cwH!>6+aapP1GconRUl z(R(|Ba%l*A>d&S7m%;vgWMospq|i%rbPPtC+X0v@_G*hv9!X~j4;J;U6{n1@jhvl+ zi_;b9J>0)52^VY47?*4GpSZEhP4>cs7(8syt(6Fba4}7!Zlubzo2SJN9rOyjs@p_* zQM8X=KwcNxJriH(ziziMfv|U&UJ!ArKNL4il=$8xFv5y~cNUlHej9#3(!p-$RqZsQ z7;eA&1Y{)Ly3BJsoz9%agM)ZCTO;{HsZ1;d*M5bEhxh)qJE9R~fU~};cP82Zf++|> z=QHx|@lfvBM$2-~=34_YaE$QNr#j9J_g*}RPExHmoz1^V1o6SK?CTvCpQu@oco*Y2jabU2sJ%jCr*}jzaaB z7L`QcRB=L**rP8qVWw6`gxQRW`KHtt&m}H9C{L^aYWA1=Mko>4YsqF*XXnTJb)A8_ z_@e6Jzr(TUm&rP0Q41fykq}iQj4$c|B^o+Q7KndBmdkNhCg^uVXjYlsqH}3&g(NO; zQ1lb(>-g(v)L5mdJ7u9jz^}J{TXDlEllOF>#Qq72?7pRxL#dMr~`rNoFuy z!0^-ZRqU*#!^#FHdTHP-b>E;xlrE&U)X+4?HAhPe^9Xn^BjhpyV}9WXW}&;+lSUN% zO>&dnv89S_q%EqCO|AYh>YRj^nAqYpU>G9*I9e9G_|pTS3bF>@Wl-LOr(#kZ%UMSV z>^8kK}TA#*EGKe~S1hQ}mYWzeRNG2Pz@=cKc$;~N1ae<>m^3OvN&<1Aze z3icY4L!n#SN`b1A0UD)dB^1!tMN+csQLfc;O>zz6@nKHlN-soo0Qc#ZA+za|(yF3O zC19awfjFiwtlJ6jd!M*GZ;NW9&G=z2;PymvCLTyh&<1lTz;&TMIevb;5r6BbpYiw2 zwHer@29S9B<@KBCxhuN&`0iwY3e96xbdM{qwrQ2G=d{_lg~@}@K|zvxfAFz~LJHl) zw);8lR!qmE>ecB>@BcKz;FXxByYd402gpy54ESLFTMLjdfT$&wOpy+;OrH-K-q}`n zko>prNI$*~e~(8Q47%y&oyg=rsY1!DR|m0i{E&=WfUiQx`~=YB%*@B;zN&vcO1jd2Xx$LjAS#PF;(L}Yf$xO{5F!~Cui4pr( zgNga7h_TF`)2QU1gT!an*3xwhr@KL@UWXoNn~C=E{|?(YsLMN~Ce$OcZ|Yw_Vms65 zD2zw7%h1gp0_fKp1A$Ulj}uonVX7_mj746UJcP~ginj=`NEie_9ff@MX0p}tu~$)k zq`~gE>&g)Y(#(}S56x?DEifVj=5RFH-6h2$J@XiR{4URM%Ue69qlajBN_x<(xNVV@ zGb>dla?{UEfY|k&UP1iT@BZ@*jam|(0te=DebJNdR7qZXsIMfhq5C4tc_fge+aM(h zW&pz|BBTd1YI|!KK!&;6mqCCjSmZ8dQHmwfC7`T{h| z8$=u>yUHp+qhi$cA9zJK@ghtJh-E;?l+o^zDs0Zt301&Emu|%@u9jKnb8#Uo?00NSL?t zPzPwF5h##FeLk#*A$`lnKFW22uo=(t5T8`83PUs~Y5uxV9ZU{A6<%*s<^F6gTW71h zw0MUjLz@~};R@|IN!e2*7D2YpF}9MEBn@VYT@ zv9BAL{Ag+sxC(^;@t5@r-@^ofz5-}y$aW+gLP{&Bd0nswYKDL%=QfV;SEaCR;1D^m z4y(W9LJ{mu`FP+3^d6_}T8qpLXhwkblFnX$@vzbB;4>A~_?qr zmyWCxkM$tk6P9@Qm1%P!A5ey_WtXWj5jm=TI*~WjQ=($sp{G2tI22S+ThZ@kdsHjH z=s9{rHFC3xJBZ3Y$Xa+F+l5AyQFZjg`Ti%MBBF(_V$&0bm_0dnA-1SyUG0vEMo3IZ ze9XiDNWfEIM0=O9V)|{;rw{<-`U{&44*L6K62ngylNUzxyoVX0klIKMG8NLiL<&=z z*YZ*Mc+(#pAO`L1Q4gy5;G~W^8E|+ok-*-WSm(>fCLpm|F#KF@sI<78w(us* zr&-shW~EWxr@k3c$&5zKjgRc@xf7x6@2=+p!>+u0j0?HxIwQ+)MFpStMDQz^$kYot z>SMTZ?Ae@tL1=FOtWTM2xr_j~2kS>3J)~sDcpJO-Y>)RhPtAmQo9Y{~&c37(M}w~IF#$qpfZp1mJJ>pnA_?$qok++G-4f@bh#>T7Mor14;vc4 zaaG2pCtMDR%B#ccXQjocha#bV@G!~hZfg9_*;Cy&L@@*%YzAWF?^R96`4S$$nf@cTo9}`V(^U|U&S>931Xh!Gf{9+fOoHe9cIbm@Xq z7UvGzHY1?cfiJ|kqnn#x3kEwQ{;t2(?I{1p?ilz1S^UtW(GDWjMjXctDnX0$FrW24 zF+G*=6g*lbLR$LBrcos_TN=qopYQAaR7t_ZY4O*BQU(wwW1KsfPcUJz%I9oQ^v|)? zObMV>*5A7;EzF+b*vHSvkP4;fiYh0pNjq+UntZ|4YsD{mSNHNEEmn0lmNOEJV7Z#V z8~Ih@tNntWSOV1&595D+0X;(8M5henyS5?hI(h<`nHiz!V&x-L)4Efyu?n^r(ZGZ@yl~)js#-k_{jRqY>YSgI2pT z7wWhMdMy*)f^1(8qmd06h1J=}D6tHmvJOvSGCnv9l?JU{dR=-zsrH7^HEcvN^B`8{ zXb4II>rw)^kT$zKzgi<9PGdqo2}HYD$TtO)$00LF0#JGIRg1$oZHw>s*$#B`CnYYD zQgJ*r&ILx`GOhgcuWu3WCi8HFbWn;#hB9j9(}mhhzFtpKwK~^*A5__r&GRQXa#3(Z)>3kXDan14dUcJh<}c-lsbs!8>()E8r|vpH+Jns`&FKo6%tht!;E{Zzt;F=Hobh69Dy(u@;~|BU zkN(DK`7-+yVv?fOgfMi9o?*yacahqj_(;ITV@e`%mX!)`n%!oE-#8@k?`$V4kY#^w zKSzL`BK>C`$x6ZEdttiX{;y(J(I>s{`9-6$_x4qtPph5v7w=neJI}}yfWo*7KQq)V z`%}=?|CR$B7Q7Hm&&%Dz1Fse~9_Fi-8G<{(HMP>Q@AK*=&mplXi37^Di>s?^vtnp4 zqxZ*(M@9fQ7o@!4kaTxD-AVhpFKPVMkG6>3aqi(}e|>IuAab>na6j8~ zbREt{k$qla*J2jrm==rX0pkG+pH<9=teNRv37;B{je63Aqn6OcJmETRh(bAo%H^6h zmis1Uf&OfDEr+w!ocs{fzOfXUbX|&E1m2`II&a~nG{RHjDO%e+dbo}Ot<|d8uhoJS zJJ;(i8B4M<_<@;8(AQrpO6oCd&2iA9_hJ6kJfPc_{5e6@aIJWTIs&YF8?e&DoR4*{ zN5qi;U)mcu`t5J0%6o9BD8yf+HvEg859I<)rJ*YyAKz)PLYE=KB!oGKOjFc|#qlS7 zOj(#^s=PHVDi3EhT($-#yn4Co+tgpF^*B)(>YxhVLD&`V&5<#KcL)?ji!wg;?=Uokyu7^oU6S{uj;C?^m4Cs|g{rWz zDAI5AaAa*a+}&!Y@9w}gI3U2dTkQIJEmiO#2@w;%sUYZs<#gJL8qloMZf?Y4!i_1N zM2q9KC*&uY_!L)YKDIww(ja!|7O^ngDwXrs6mMsN$lZ2(TP%}FBWYkMWAjfbZ*96p zDUv6z;pi9fY!2rH4md*AN*S;7d;1$3c_zi8#o%jvb+tt<(Ug`JPsW4RjMEu9sNRhY zfy3dDWKRi+gij1#N7(oonJ-laV^)HD#!&S6?AP008|1ewe(hcfkTKA4^Zt^#dk5>S zl@WYx_e9+*7&CX~;O9Mb-|Ba^Aab7u?IYm~wU0Q5Hxfz|cN6;YLc$z&n`ki`wDK_Q zE3P<2faukvr72PM4Hn>G)|%#Y!?@Fg9vjZ!%4Mz}r=}Zi&yTlUQH4K^QiKi2=@7vvC&7%ZSxh^DJ0YjPwo8krC3b>;b@^Frvi(EYY< z%=y!$9VDy z$YBzI%Z${I&J0CwsXN#C{(8YHj=`J~-PMo;oD`wS7gciLgeHR7>IpizTQvCAIZoe( zPLv{#qg$JlIomj|(xtL>A`0Qp_=)`H>g6Rp<<#o=Y_!wyMqLcp-hsS+zeM3>yO?C# zU?!SX8$AKGQ>P=;N&i(}9ntHiFZ1+`jqUd-1qZcZ#0)u%w*t8lZ+=Q|nsr2*JWs(< z9?QF|kF7YP&93&aL_r%6lukNQRQ}4teHX*8~PM{ZD|A(;`9-aw5&yHze;%l2-$;1 zk}#41(bdhDl}(4j!P!)Sj0&E#R@YQ3(_M}$JwndVS!6q!h^}{1m00hU^aNGMR%S=4 z=NV&966fmLdGapP7ReVFP%G}g z^;6(CKfm`lMG^*#m!WokwO71{G)OaMMh{nc;1H(F?H$kZNd$btP34dP7nFUn&`i_;U8VM)c$P`4mZS%% z?uv2q#MVh0Z#pwJM4%U4<9t46oCzcm*AUcj_yD^}`<`z5}KVl>6-)SBoyz!DuS&4{cHQV==!lyxrLN5?^P$7jg1bb8n6Sjf@hq@JN4h15IpC<7 zu8I@g!V=m0vb+?q3_YDMl%c99O&Y5FUpEFDwRdYb>rFcUR=2-Tz7M*}@bq9M&t>6g zVP+#L&A}{hB$#2>Lo*BS1!w!MsqDV=|96Cz3HcBJd30qTs+D~anzeoE^r6SLn8Ra- zA(k8xL9*x;1Y~qPv|lXWObT8^eh({hDfEuLu|)Jlbbxj8g(}IZ{Kwne5L57U|1&qb z#Y^v8$lZf+X*I}tKytXs^{{e5f;JXn;xNu}PEU3&WWM#~-^*ASh5Rw0!w5saHUCdy z6RX+Q#1%dBoh!{G{9yvp(A(SFBP+TsDf3R=YG?B1A8f1wb*)A0WJY;}H+5FFT}!r7 z3UxGhEN}>ROmZ}g9BVyiC|5M*QH!Qp0lhFGl)x`u~U+92N%^kJn$TLt9{QGV^be# zq)!jxKpc`G)yl6N?Ai2OAV(Zg3dWA|{W*o=pi_Ab+&X~Y9Je0 zLuBA;zCZ1^j)Txvrbs0S-My6$>OYB9^F@A3ohwNdxAN$4=kNl5Jc&{;s@nXHP9n zE^75x06hoiGx%hwX*HFTs7_HXjn5pjp`72GccoXI=+K(xN0CL@nezEMB*GnOe6cvM zCzXYUX;cnqVK@vO!qa(i;B*Gge)*`YFgHU;6i*vT%G~s9!aLfC=0vxncA|4O@H6%n z4r%IcJ3d<^TbI$w{%DXK#NxL;X9P8U#l7IbwqZ7mE4C3Yop!tUa=$&RG`tQ&4-cuG za<$6KgZc6if+adsrnZrIHhFbp!Cc=EZx()js=O_yrbD>rKRze_B_R1=?BpS6W{+r0 z$@$vspcA|JmuO$2IeB60^SO6cR)>|lxj(IAKwf=BrMq!KJwg_XPpMU*Hi^^GrrUSv z7JVx>WQ^uA=*d!pY63I{Is~^lKp(8O4>4~)sko#hoCOLjX=iA%2(=@Nf zrJQrm(oD6Z%-KVmgB^bnba^d1mks4vJYE`wc~sV$k?JqtLm3ZnyohH+3U!V*&+5uq zS7v*I&!{=0Iz_Z&-V3PK9wb{wA`HQJ2?`#>PA$F$K21n>-L+6t7D#CVG>Y5jK^51Y zOh7+`e(FD6B9QnWWb?DM45s$(2l_e#`Co=kh5ZD|wCdHU57HgSeB@JN;#*L0;jket zs3lhw|D{X5pv!q%D^UzqgKWjwpXOrWvmTs4N^!|qAOkdTYVWq;+C==<3!n#WU{8&O zV&63iVA$4lR6DDD+FtR3Ejq$>(}ooi)7YS?=lr428QYS?FC5(a;_-3OCYYps$yrfn zMy+AgX2 z7;Ob*N5Kh_m7tIP%!vJ!>3e{8qG(wqzRwJ7{jApkOZ7%hOhPM^%!xZ!^un4v@P4*g zCfKWD__2c<^GO8d`+g$fUSN3R?QrX{m8^?Rt!5As2Xq%t3}wc-5KYLR_Gb~QVA@EX zx{f^ED50|cbd4AFnYk;kaYro(U7CvhdI(lJ`)=I_p`U<#9iO`Fd+Lo)tQ(aiY5DV{@wf-q)oJl=L}Ue<-KsG+uoWFc;78emk|| zb=*;bQ_RWt(0!uQ+N^14H`zyUN?lDK`YmXz=$U1*PuUb1qXF!UUK93yB z=a0*B>{j&ibnh$9%dFRb#>4JFK0_?{M_jNz3u+Za53F*mSD=C^bq}VoJIZ^S8m)ov z;A5zXF#maAfnWer%+0h~Z10J|`<($%7xoVm8$Xn; z=Aq&W7GlQIx}2Qc`Li~p*O5aVt{Lv|Dxe}PM><^=n5pfugRAe}-QP=jPThqQ&bni5 zr^tkgHRi&)*-be7@{f}VP|F3}05i1$LUA_f%fAF}UafiVMscP)c}!-mH<&ngzAo1) zEKO8MfOXSV(o^wdvk8*}X@7h0mU*l9r}q>OW88>(xMt`pZ;TI}80$AKXo5SP2eM77IkDM1|D8N=0i1M9D9D@DbyhaOPE;5glEOD zn}6@In*B4PgxlcjVPX?oXcCXLt7Y{G!hhK0;rKS+hZc>S9j9R+HJ^WG&XSpD zLI$7c4-lhv0%7nj`*96ijM6u~F8F!rxx+pFTpe~;g=RiC%+Gz%VWqJT_*J$)gP8OS zukj-z!OUVdDH-x3c0rAFH@z!_NtXRVyQyRY0y5Z*9tx>+O3I*LR3V_|Fh=Bffn7&! zQeaxtq_|*lM~)u{ykR)K!U5;~E0Ra#mLCFy^3`!@kROHpY8p+(FEN|wJmS6fD+Fz1 zq*5#{0%;UAw@2U+ufeV0pd*AKQ~4}1AbE6^O4PsV`rG#_@?zV@rprEKTJwTqj`7bF z9F99`TC`s^EmxgOw9zH^j0hCSH{oq?{b(y3FPcY)TWJ4=>2Y@{rYjK2lAe(Ji)wRI zso?yOwAIsSoB;9ogWcWx@Vu*-sK*$b4x`jZMwySPc>~I{=MYC}>s+L_-Sb93xbkz4 zcUN*pciBWvz0!VDW-K_LEPlDDZ&PDK@^6?<-!rQ7c&#aq&;a3i9QWhe|CVOa2j3L= zTrm4uDhNIW&yOrbxx(rnz!VaAOl8hA4*sW2{A(44W>`Xg0DEXmp@$e^2(9oyeUvPI zP$CC$s+pdkmv~%{6Iy@Q1XUy+-ktrMG-&c-8TuNN4HNbYz7>}8yHG{g zKm==yrgqJgV+epKi|Lu4L)L%2iNY#$VR)rkSZ02}`eXE8u5M#jEf{%lS{|Ws*50@g zcc`vSI>`fGFVR(33gJ|2R|+t4j9RqTlGG?JpWo}GRX`Y>yjMGAfg`&yl9O112J{-d z?BH^I`C^7kDLYOdqv{&2#*(#EOD|@{`(^KrlWpw#yTI#VAT0M2;rU8(B4IWM7cZ?e2 zBu+{I?(RtP7a@pt>H#fje^!q<8LNHzvEoYAMJW`kTI05992io}(SZ8yLXtKxt^#pw zLks@uN@KUNE%2l)D?aX5xIEe8GF$JW&((j1TmJ@JnqVyWD&%wz_}$1ifCn5A5qiSo zUit@n1t&%%;JxHw-2KpCzj=;i-7OOv59ve9zV)r5*O`9mp*oX#2I(+BHv4e5gAkR_ znX5q=&$fK}#ctJW@q?KlzuegA2S9E|57HD|_pjUToTQ-0as)(RF3b6Q$Z4270dfq)Xpm z7&R+LYVLb_$}$pmUfbtfmMLV7%p0YrJ1s7VSMzub2aLvlGAJsst~Zo@zwTK-;CRrE zdS1IXdOm+CSo?5o+JfheArO?TWKxb?aV%MouH^Dsgd1I?tbC-bPc&&+lYRh=X4F^o4kiT zy4m6Pb}wL4x<(71^7>wv>R(+hZT(h&w^aGFR%qMv>LWb~8gOeK8#r2?-!Na&;#xv7PuE!Aynty)hFUM8O>ran^AT*}>>YEtZ_e z_F*aNn5j#!@J;LMNE2)n4c50vGIy@D|Bv7U|9~9w9s1&KpTpZFdh+4OE-x9H84d3M z&_CJ>yZtVSYls8We6;>;({QPfC>5ZdF1yF&;!~EUC0Yyfd?|+%!$SJH z6@*$=SUC6x;%bjPoERnu^RbM%X0t_yT&U~AYVo{bgZYMs2azbIDwswg(`5^11aBu= zFs}`rw2+U6$-lDmtp%z@k#^VE{lnHB7Y-8*sqV{Bmx1~7Yx_Ug)}fE(@4;HxLmI># z^4PIAA9(fp;VOEd(dLP$VRnT4hiBGPh4vCw(&x~XVqJ@>wVF+EkD)%z=k9$S1fYKU9$Gt zNQ<(`Rl&yk<|$dO5NQ!Lgj=Isy*=Mm(^*MkVOM=^1MTF8rb%a>zOtkovhX)MaVRSY zti;s?OQokkf7ti835yRHGEY{pZU&*IvKRET`Z>7cumE}_RK~5ksO|GL<)d)!d}gU_ zUF~p!PkLsfiZf*SAX^fK*?!zEHl1?)FDgtvc=+P=ZKk*7aF-NJZr>CxZITm(_RObG@HZbH=&$VcupV0r~C@aS|{aATdH>9lZUqVL4rg4R$h*Uh#qy zl;Kr#t?Fjo_{}Sha#R6fk#KBqs!o%)~da&~MSS_YdparVhrIvz&q^y|R2*C(D~fq`uxg^#=-lUoK4| z<|*O6&kr#z`iT?fct7@MU-J0mqOtS+xwCORjkC24{TtAsTjAG(mV!Z(LpOvuW4SGd z!J;8v7h}pUFkA}t3Fd2$k?LCLhUnAk^~2W5U6vWOL>eLU?#WDw!QZC0+twGHx}O78 z3cI?9$t#}8^DU#gqgF4-lU1o_oo3I3?R#)PBDWdFM<>;WhHLfoccr6p4&L+@v`ZZh z5qo()TNG|SqP9}PY)-yazBBbJPvh^6!(?mI_=9!9pZpafgR~Z*FLsh19t8hMWB;c< z@Q=S=03tv}P5N8cw}rO+FCym%!0(3%fHn~ha_g}lm^5pj-N`^0ftydz>A)F^YPSP# z3rb2+T@lQhB=ex;o#_y}SS-YV$N}z4byIbNbM!3{1OlwKMj>=zb`TgsI3M#8$%XdX zdYa6UXpPPcw}*c+xCV~}krWXtQ6BzUrjQ&f1v9%7>jztQ-TQy;YNc3BKcApCm4363 zbTd>h0j2`AAoV{pI})0QE~>{iVaTF$Fz}=dR>i(-1wGV zu%XQhTsL~=BF(V>GGvXcw(T4*N@+Q>Xxr)yTc0eqt$Ui)ua-X{gLR!aA3vn1EQ)}R z%rH>n!egDD?_p%fMC8)!NE5a?>ksp&@d#xdxx>UpvEv#e5X@l@a8QG&QSMsGT1CDb zBB~vet=3K4_B2&`$(L6Vpw8%YyMWm2qJ?KOsO2LM{BeOy@!`_IJG#Ps#Lj` zpD2>6O-I7YK$O?O+fJ?sbrW|sA8K}!Ni@dqMsI~41CVm=1U&&C874Ygy5hXTkfNo& zv${Mhmj2~M+g(FJ0hgT(xba>9H1yYPN%ymL-mKL=JH=c*UHD@0b+FpETku3G#-p0; z_ObcCjB<2Mc*EK=<}*GYj2Hyg%yDl8n6bAdlhr^LXc@f|5(-l?h*eW%K3j`pf7)=r zR8~J{YO758qLZhg7bdcom4byvi-b>*mcAAe!f+zw?{&bv@I8cTSE6x4FT~@~*=2D~ zC(}ppVKjrp!H4g(>-$byBJ6@pD9c`d>XlVPxy=35-guURoSlDWj&3G$@dskcJ%luJ#7=9IhmJFXe zp7>96Hmz`@iK>Ue8mCodqm?6`?ONLjiaWye3yfkRhULAU-%V`HI(!$$Z*V>T@9?c@ zd|ZBLKl$Y4^@0vQyo4O}wU7RUX*<>as=?xO!;cvM#!Xs>5To+bfR30TExc5K*8CN^d z1EIgNK4ysX-N26_#{yXpIS*n4-CH5@F=?Ro;CV1L}fGELJ`LRP)TD?}Gp zq~pZ9CgI+Ae`JuIo<2ozl(K~8*J>`#WmlPhE=8}kLql80>pRh@>nv~S)^5Sdv>jDP zl;%F;Yjj!rP|sD;!vt0jJyJ}HNf_}Key3r4y`p0CIZxWc!_3A~&WtOYb6!knHPznG zvcP2nYS0R+0UN)k27mm#s=Iz|aAjq~CaPXNrb_Mg*Kp0!jt@k9x;&PiF;;k*Uv@Z+ zK2NoCAC&~Vx-e5zB!?bgMwa$7&|cL-W8e^yc|=HF{1PKossQuoX13mP$osMPWWuF#xu);!h21HBQ(l!506QlNLjIne+LxyrUzer$h&7T)ap4Xjri16EZUzlYvdFWD~(Ts5%EyjHsHbt*zC5IH(t} z(MjE8e}`;i@Q_Nh7@5!Oww5sr-e=fnyH=&#%eGD$w8_sIg+M*4M;{$iScy$wzf-Ou zjUdh`SeLj?#Y6wh$Vebxq3hcQ?0wtSCJhip7a4u!~#4Pt2_Q_{1`V{Atl|Jd} zaS{vNLbHdD1X7ggD)dZ2H;LcsrR}Mo>p_<(KL@%s@g#M0(ZQGNC45U=1zx)214uvy z-*)*mZuO8UnF%+(qHDQB>$v>kwLQesZALijxYTb!sj2PuL);1Vxa!JHaaLjtjHR-0 z-_ak(Rj&&dgq?&OD{$K{*c%-hqR}aQ$Z5+bK;<*4Z*6E!r#y`Au*aQDuW8)$o;9z} z%&8I(W)d>*;!3$gxrW#bvc=XpDgC#p^*^Qg1=v+N^_oWjrRu5ja`xe>tye)p3d|#& zD2A?w+;ugjyLID&$Qc!l!A%f?gU{;Aq27vmLGcSVFy2Dh@YnsG%x8o?jXi^Ni73Q* zzPh=2VXAhHUDh4+%x9DJ0PP_B6)3jXzf&=I7=+?5jc!Fj1a-lP!$@hj+T@rARZ}JK zdrAou02pvig7FQWR6~o?J8OLF^$B`j|I6?m@lX64Bo8s*WM-u6%;4Zi9nI{Fo~aWo z9rEKd&Dmz>CL@ZGC5u#9=<;RKK4I6lPehA`;{g~ZiZZE!Z&zw3XXiCgUT)G#Xw|6E z-Zm%4rKg>*{cH{TnKU;PHGA!Rwjra=>aDR2p8GvN_JJQO_5VW3EGp=)x zUX)`()(OmWfC}d3T?X)BEa&IdhMl;Ldx4mAU-I-~V+mD=%GWa{L{F{VrUi&Hs+oKS z%nma(EVC5Z&FjZ)aa7!=i*F*K01RnoCrryD!@;2-i-tBDLHBGjgtO=8Lwl&!{Cr_MQlWn^u zyC&PVefB)>dB5}h3qRcVy4G6PTB7}U$VoSr;?VXEJ}mvLRjLT{bEGtXAbVb$5&n$#JVZ*mBx@m^ds|XtBKy)fj_84Egp^p`rPRn$SHE7TE0BxAW&?W8NCdD- zhj^T=+Fg~RAR-=WMa^kic|{8}@fv2TLO)~>pV>?Z)1{9$-%-~w-F#f1j>g!c{TR5z z|M@mhj*R%1?{$5}^?GrT$!|&jeNVrcS17kdpW9K6xyqDY`yN^$e-`LZPbY|rIfb2~ z^i>r!p!pm;xVt5rV}`9-D|>V4xc!jPom>9+1M-LC-orMMijwYOZgTb!Vw&TQ!X@wE z&L6})Hvb>+?vWPRlflb4xY@BsZGWNNRD~Xb)OfEp%H0iY;TaN+!phLZVnOIxUfdO3 zSC;4JZ6~O|Yi56jlU;X#ZvhF3lOcqcG`F&Oed0zwG&YPI&CqH|v?-SXN5kU8o zSm85F{KU+m3Yl~yZE53rD*J!>m|76Y$gM2scQV~GSkRRb9*lzm{T0VfBwjF!T5Uuty z`{OBFmw;-90lIx&^&0KH#mXO13z|731z_<*A_Ska1qVWArba(_RWI z=7>rMOUeWqOLbp^w|SwUWm5es+&c!eZD!K)E!tQZc782crfUr?ITu@h}l{L3k0o>hAk&klB|C&Q^S9UL{#)^92Q^^!n^dst~ zDo~A)n?J{gkfqg(oHU28>1OPku!<5^ZmmnYT%X~nDZW(tSs=OkO>f59oH&#CUR*gn zlhEIrNe+j zj!yJ{{syZgpe@F)4R<$P?WX)nwS4vT| z;NH{ygmfw+V`|f@T~4lqLE3wxKS^+|viF5^0}>8u9V;Iqf&=VK$HJ7u?b3TbG6NNQFx2C7tO7yprTuvs5Py(4LR~$E zYcxCh5+8>G*BxNine;$dhpKV7SR{jPeX^?wWj4X&3{48%IAkf|NRMh|jjD*dGMjS^ z@vxO-@E0hP74^Hp9sy34oSEO6&)2`-8i`1L-fltJM$mKazk6_NdOZ*F;;9~oXuTG! zs;r6jIjJx_;9BXhsT0L<9fo5zwd=S`)-FO*gYPF}0}>ASl&h|KN({`D8*5CeXm!Cp zTxI|N{3i*(0KFKm?mU*wO^v+)R$oYVz#_2w_$0yMZ>P`13aQT4>(fnTD$gt6ThC52 ziUC43-KL)oVi#gY2oDOWNm~t1s+1#=%kL9N8bs#^o&&(Ij`!!2`*p927N^T!`x<~` zrH4K>HRw$Qy+|!0a2I==H+o7aU4&N5&SiVnj0;JTXyh z;MB+X#%smdV#``7XG(>YWo=fYpU3-D`HP3;pR`>8G%NB2^>0T-X$&A;J91i1v68sIa z%LBM(r+;AWN@6VA><{5z=5HofVr;Z4wC=z<6;6Eok!=K~$K5Mj7aLv*MqT?>11II) zay?eCH4O$~zKL}rMwK2nU6MGiW-?}D9KXR|r;g*3=lQsY;F~PZeO^nxy!(N&s>M;E zH)^lb$@kvQo9vIWxfHBr5$A6a>o-TQ@s5f%pgf$0Tq)xX-2Y7L0dqORSd)0F94xeG zj&maI;(6-U8YEYITC40>`Le4b;f zz)ZEY(=?}2QlT;rs;Qq3K1+?3hR|Tso2jdT&vkHWEHvFC#S~WmN+YbB6aBnaaf{8o zezW7@WyfM(ml|)8e`CZ3L=R6R{?Z z&*-EplfWM%(^Xg>Fy2GN!EF#?qDIljE662T|!xa^jE)6fB6@XPQhw)9}%ZO$d( zFsEXEWMW9|yD!IoW$~y56b_B5Vn{iIuL-5makrMt;sXopX))eO#)dkrP3^oW`DMZc zwW`L?DFCJkeGer;c7Z-?t#=fVr3O(gF zG&L-P{avPAU}tMa2(P4fx%&P2+Q~e9u+CTBunA*5He5rn4tI#)OoqD5{(S$xY*V=p zf(lR_pb+4TvL3X9NH_@2MB?5$oLO5ts|McMxSK*4-s|gn0bcMEdl% z9UB}scU}nP&M4hr;7nj z0z2mYfUPaVL6g)f@PFT8wZQc9{?KI(o|Kz~pMUAl*Oz8z*W8UGbj{9wXGfID&r0Ad zYZpftfdDs60?iT_L>km$e&5Cg3gx#y?Vzz&FIVYW-ID>4TTFtLRIQtkyFP_UL z&qIH@{0uWpgq#L>&BexL+Q&{?CbP%LXsTo6IUt`cU~IWZq^V*-eY90BlLZWhX0VtT z%EvvO73#=c^+5OX-q52xDppmy11*P~%L}^NnEyIaq6!1p4m-(CvM_hsf`n%uf$52I ztqP5JP6!fM72w@t0i0Qv_*Wf)Y&jxX{UB6Ty|KJ%x+SiFhZE1|v*Rh#mpf+P@5E~Y zY8m(qt)VC<)>3>_>=EY248Q6od{Pz@BdNIG^h}GgulAzX3{Pu9kr)J(wCXN zqgXPbglHw!$>yj=J2KRd_;J!hzwY{vXZg$ygeoj<`}3b*QYPzUH;5m!_os8yU>S5A z&jyeD@ht1Lv(;)dw4L>-i)>YAux*&uTA8IvwTAbYQ5dZ|t0>)bw^yIAi-TRva$yb0 zX4F^m;6{=71Q^IeKrBO>TSRW#c*=|1f?e3hIU7=(7=Thywd_q%NV#^W%{ZN6)o#8F zz%GPw5eqq8tM5B*;LSB8hyl_cAwQLWVtw$R96Qnc46^^)EqX@xOl@+xy(S$Z_QTA|oB<02|p9T^l(d5d5G$6;vzKzy)j2ww*>{LU0;yqNJ ze{J*0{NI}yl@ofZAlJ`4h#A5nSHW0}bh3twh>U-Dm}>j!aHSjd`Q;@O7greP`3n*U zPwa)bCa@c*-(8F?7|wJ#^pg_BKM=PvxJ&i;Bgl1D9$|v_Ql|iZ~COKG5j`wmZs0JPVRliMoVlI?hB>xDf)f;zc3n5CLVh<#l=< zCJnl&ao2V|`yl+6!_^$Q?|v`Ia`)LE-^+*vTqfi*It(BeK3i*bHPK{rw=NU3@i_O# z5PdQ1Q?HW7RIineKAY*zksI2k%l6q=_uNBmH2%oDKlnKEQ+F>6#-6=NUQko?P01g) ztNePuLarIORj{-~%RCX@OKg#0^|&EsxSC=}hh^n-y-1Ltez556L5Lk!RLBRd{Vhk$ zc2l zX&JN80I+^o>1}@@`BpPvTefi@NY!?)Mb2r{f*;aKDqx(N8_NL7yPUrIKJJy)Y|F}O zoS`_A!4#Z-dM43-Nwh|eCAVz!27~BgQ)girIY)D=-O$b13z3W^nD*pLbpq-x2<|Mfq@S=Dm?Y2mEC)McfjR5iKR^FIDMjW^yW z26OcoC0ht(X~ggYibPeSTsk*!#R_wtJg!XcWe(U3S8`&jH0|!1JN_-XUE_4rUuA&Q z9pV5A#nhxeH)!wdrm5o%y;5}ts8Aiwzluma3Pz5a3|UDvs*_o{wP9GIwo@V%l1Se#z&A(euTcrzsZ+6pZW) z(&;HFCnh(@gf~?TmYz3{Uj%24hDI=icnch zN%GNj<76fVYLgP9i9{|YCFbljGd~=moH9Lqy6l``tJ5t0@r^q`qBX8{}k&H zS2G4979_&v${W)_5fx(}9EM8j>Tq;5W|X1KL%RQmQzOt|@9O>K;)~gc10IDFhJ%}7 z9E%d(rOW-r9?+3UE=h5 zdiAfS(RPjchR`oBo@aM%>vc|I3p(!!`Toa=arW4>ht%LlZ)M#OMLW;*3^OKsWzSn___%1kf2MhMP^qq0tX72o&Sr#8dLZLR) zHRkTHU+n&!;rg%$EX*N4a@}ToKjk7{(q6{T5n)u6Hfi{@Q903$Mx$!9{%Y(^;?>Sb z;8qu5%LG)$chkc<>Tv757FrhggUqjHEv-%_fea5Q(XV>G;8=t-#6;GTVd;&Ajw3$4Jx$cZ^i&d9Pf6_ z(V&*#T!rEIa19FsF9#bY8?NeF^J`}u_-974jW}f*8WR;j-i*i=Ses(mx~>Oa-&4FO zIO7B{6GV_;2<7VK0O|?L%b&W-^t2t}H@9E?JCnE_?^H-MmIuGI0?_LjE!J2B`D{z3 z@$p*{Z~8)X^!JW8E$u+VK7#eD_m1FaAsHDMpR~=wh=!Pna6*7|_4r3C%eyz&(#R$_ z=}T*h30tldj(Mhhs0(JOFAZu7Q?&}JGk1@`YtjFWZ~@b|nIOOtOm~=t6kbZgKBNFq ziSWAbi;cOpud%Mb*5PJrYin{eCzzd^8idZ$cL(LBuhbZa{nLKlh|p7pB!0ZdUbg3x ziKM_X2Nz8jj`XtnwrRFp=}ZLZJ0kN*3UfZv(<%U(Ef)GlxG&&2;lo4YdK=YbrfjkL zXkw3uoP`A;+LxD?b-wQN$E;Oh)CUEKhM7;XZsNJugB#s~za;KJ_^kDcon8O4e{Yr* z0d{`Y4C4*R`~+%12SHTtV}9=AF|#$yB9~->h8esfvxZHk{J6LK*l*`$)@|LL@BlfS z!fOuk_usK-fs>lXskK=YSk-^h4^|Yeg(attje^9R$M;`2S!v zV_VHtlQSqu8}sXEo2NJ0HrlB-XlPwtS<_iHxF9$B>W1mI^4S(mph``FqmtgcpsJXH*PoXZ8|mjY~&@6?4KUj#Gc*O z8yh-q_nD($W5gxvREI6Nse^i5IM_^A2wY-JWgE$XHZ zFJ77~4}1pM#)z!L*q35-t5QiAHelJffJ8&{gZ~`2ug0WrB`q*6&)B0#r0VZ~B>U27r#mIG zz9D>NR4hNmeZiL-@lOFnwXlxTg<)^xxtvYh&}J0V2AQf0)`;3pu%!sr3(0v~<8J(f zP4X|~tAGWUh2eW$4;N)Hgs(RJzB6EP@tMy!xi607q|sI(zmH(M9-^}_bl8d?&-Pm= z1P6jG_J&JfG^ovf1h+5dpIRO|o~00`Wu-LK+B&Ac=(x?Mdk2`QKveZamZ=#cKr}BB zl>SyL%J>D)>G9Ungm&s&{PiN&NN^pDAqx&DNo)_mol%l4sjNT#bX$S*(3GaW+s6WmpZy{MsmFSnn~*w}EAptj+=4GQMO$91?Zg|sB{n}@HatGEc_Q;|Q`Zx! z*IB~?QLNohR+4ENnnRA`MvaB$OH*XwB4VhAE`#yLtBl%2>s{O!8|#OVzoANQ@x zkTk#u@ApnfR3|DmJ}Bs)@#^SqY7TbYDM^ATt<|gpZOjd|xK!WB@Rqe}Kl_7Ss z!$hsB`apSY=J^+c7=e+-zwDEOC%D`V0p@F(9YnJc^2w^g&t+KB*(znSSI zuA7>lIqep3K-b$XrC!O_9Sq^9B>cPk9Vf>f<0*s(MZ&JS?|<(CK+sR@DWk3Jamr4X zgq`jqAj%>ehwJ$Lr+UYzI}O!I2oJkEE%9}8tX{^}1DB2SD}^Zyxd!y{8+ZuN?rQ1G zYP6w*=(;9^`>jWvR>-HncM^LDWwdZam{TeVG|g5e)Sove_O`Snv;N?!NPDP-rC8W` zMCh;6-h>oX_1vLfm3(g~k$=UDtq3*w<1_D|(2&5Tr@jUrecV%)Pe?TVoI{kWrDswO zbk=KUcetESecEofw3B7IG}l6Pe{*gzTT&xCs;m7SyV|thvy&aS$y4j$9FxB=0m507M~zr|lzyCB>^Wq$}o*va0j9H>{+9OPKG3}c=F z0e8Wy06yDxrsnsPXAcEH3TCZ%s(-W952>EWLSu4qB{+C+v0U=!%t#cyr>KXWC*bn* zFg&YdJP#lB)@Zo09IPoz?qOljtP(ohe@^9p`J_BZc*r?8Ew%P`X7BzYtd*%kc#|v= z{IxNpLg#oS-(sWDh+iHq+&t=jIpLkK{Otw?d63!v=tN)K9&Y)1i9e=%4)FT}P#PN5 z>&Jm;*_PR6xCjUF6p%_&Rrc=fHI%#@gO}aG>+TUiP=+ND_Avot9@McVEue0x%nT&+ zx$Jv+XU!6U)=GusRvrzFiz8@+4AA6KuDsY0WonAP(ew~^M*ruOaxd!_pYNDi=;ZS1 zW3^*?J_9D*a`#oNwV{!UA%K!gz;*6gwms`Ank_aiL|Hw|TCANgL!` zVZqaO#hjED{B9vl7I)r*GuMtj#|n#3())XC6S3BR(rR>nD7wMI62gEsK+h8Xh4zgk zd|BiR5qjsQ0&5Yk)a1%y&cPx^laUm!q|5v7#DO06=E;Hxh^8}i7EYsIU zq}mqt|N)}MfbMR$OuZ0w66U>2$MeVD$M6~b1zpu+m1|rm(yh=y=dhEh))x(zROXEnHWyikqunrJxA-5HY zkQk?XRv=*pP{`2GooJbG&f!*AHl#%>XmKPohDYI{+)oGa!Z0<+I{PUFn0OM^=BK8^DyV==N5k~7E!^p(Qab#eB*C8WX+h&ra?0oT*zX?pa z<_s%vn;Mz4p_*D^z&tv%aeJ%JR&_OWIt^u_W+p!b?K~q*I0z*_Aq@VJBx0uBpmE2M zFQv(#7Q{mLi$PqJ8PT8stPdfojTUZ{CfzU;BDAEPMHWMn21I21X+aUD4`xUQ`A!~5 z<7Xs3shG)ZCBi6Zl~n3aP90{6trqFDw4sx;HuM#a01UQ_y{SoY21we?d!^Rv?Pfv= z5f^&BmUQO4al5JFSSb{2g$3tMD+6H@zC^JM-dNJ^_bRQFdH)_i%iL28(n6J!MRzxS zjL_wATbIv#{42=!8qi&qakl;ven(TUY-1B0J+%DR0X7qFWxT&_e5~Pr)S~nb;qDP9 zU(uXs_|-50e@U?7mH)K$hWc3h-(z5_0N{80x67>fTDe999;( zv3oVtGU8?E`p;H}-y-{YYpAkd{hA&vp8RhRod%Dg!r2b{Vo`_ukoGZ}vw;H8PVybK$7fh?jKLx!P=Lp9GnTP4*KGD?z|<9f07~gs)yqgAj^uxrqNyT z_=8n038ftibk4Zu#F{p5qA{VXSczDup_ftFZ0i?L)Ga0sAt@s*^V_<8V&7`CFA?S{}5J$tQ(J{lT9qiHtYG_STCNdR)w-3;4 z!I>C&jsh>xZcnQUNwxItA;?b{Em%)Z!cXxqFibL8#MP-swA`rs6v#Lg7xfkgwq@rY z;^YWcI@)W?svOOBAuVc7O#aepPHfupTQE0iRyT%Ge1L*SZQh$?f#%v)7`^!U0cw)r zzmOVOc%Kpj2;GC%Lmo5O57A;ptX=udHMv}gte#l=+~eR^OUsm?etn1VW6SDJK)hgk zG#BNk8`yU@Pu);$jEmT0Bnk?(CvOEnE!pVJh# zf?Z~oZ2hBnBm_)?`pz4KDF7j0!zO zH#-Oc9>P86>GlZAFu>G9+L7%Br#ib$dg|t9lBZO-u#;Eh5?QoX~S*Vxm^= z$8Y}thROj?t000)uU%Z`Ki(YzmK;^+`H-^c;-7_V_M<0q3UfQZx1k{ zAw^l=KRf`#igFxifWr(ZE+pT(UZY{I-gPN&veTeqt>ZrO(&jr3W}wsO zl2d-8gjh&UW~jAA)Jq>=IisvwL(|H+{Ip=+qnM;C*c~TXY8d~x!qUJ-n9}rN*2V^{ zTTzKp0g#3|Bn&%g!>HPW9`ck&reM?^eeI(KA!s=o5+mXvZ#0L~_B4@01Vfc*wBndG z>ncra1=&tT=ir5vPkNcQIXpNg4?0ZC-!~7Pm{vaNTQWwwcR#zWZMj8E;b&Z;9-& zlcT8l_p~;M2^N1q@elY6iUnLkLu>f1B5fXD<$eFkwONGKbE=dHY~r~ z^BXZnBZCLdcn5`<@1{iVSKAUrks{KA&p*Psu;%rwqo9%CG@a15UyPP%`qMk(0>7X z9*ONE6cE^CsufHc$okO+Sw^}M5%D9u(8y8n5fzxa%bM0bMReUb@juH%YgQ4Z5XaD($cUw{=Z=KaGd4!1Z|MZ=QTcE1}f1}iaTVWKo$4fiG0;q zn_p|^;?q&Iz+5+WcIBgsaNzq)93S2IKLW&_vVThm@+CqfG6Q3vN6;04yDh7Hs$Vr8 zM7vQ;&u4d;5FL2!bDpARp;$hghv=3tF>TC=z^kBF|=S%(K^Ykv*-CHC;w+kJlk>YScaMW zMX?0WRY4*6rAZ<5X&6Cz2|{ZgmvVFFWPP?ZQ~Xyu zq|jVZlqok@XU7YhDj(;e(Xs|LRE$6}m4}lR%XI=NL{~Yf+A3;smu49Xm2zW8C%v)Q zKKa6TodlIWLBl(b$IEe2e6i7rj$^CNa=d_TZsPl0mq^>_ts#2B;b)ndG=JRe6B>=X zZMG_@=#7a09b}1mb)aVnR?JaLrNP)eBmD*o!Y9L(rim^(g#42oiLpzb$=YF8RgQLi zYA1c8a1pRuOb?2s*}X2y>*vd0r>*)_yZYSzvldUARILLNv5x-t*TWaXkF<;JJAKb8 z?@7)wE9D9=-R#!&`U#QUG`%6G;9Za1pI`glzh)!tCH=gVFC*ZZ=WNCBKEc=5Z4Ei$ z-@Y|_^&A>;TKI9_9MvNMotkf6b3MBntNnXR)kp{h2m|Ays`o^w4?M z(oxKDi6>pMTQV}Wx3QinjXz%^E+G5r096S9Edj+^WqsrZ=5=I`c>?3u5A+>2@27&u zoq4hHoT#wR1j&aDYBOGGa#aoJ!kyE(6b7WcBKXb5B@UC0c)^F`x{+H!Ue1SXIAR#; ze9-=1g$M7xA8t$BPq}5GDhR%SwHFBzKK~BUqTywW&rz|_;>LP+By_;J$^48@(tdfY zwa>%{6*mi)3Usi_DDk7TKxTpKQz^-SC?GyG8^Wp_medKk(5&0bg_baH&cy1)@y6DZ$y3_vv;{;B%luph z<-sD>&@Ao76r>g14fuf;eEDgjkTq6@|CUSz{c5#`2R)xAh--rh&Ge zDNE`nHFB|tInsodCM_x*SDU(z2WdYs;J4*!KK*X4@^f56@m%x;*A#!1kVGZoL8}PJ zaM!xemyUZr|I`F$TjKoQgX)Wx1?Gf!YBG_UYNcccHzCOdz?-suLi(lP<-b_9%AhPEbyiNqf3XavH!DR0NV+2;{y^Htri%|1yA1(x}kQ8P^ z!C9cub>8iatHA5$yYcs7%HK%)5)IvUkuUfnujiz(v;E~JSVJ`S&{&5#?O3;qI%Ns5 zWyII76MIiFUl-i`-Y@zvCqG#D-#2|lX&d_LCjFRKg}8B(aTRVdTzXgEzrtbu{j*bw zEe60*(#oxil&N1@^Xi*@_^>nltdA&mHhy_zw}BKU^aOX2yKbb)Vs`asxLV30`xvf! z_R!t}{aLa5tTiGfftpgkw=~i|(&M@mDcN&#o<*j!R_%cK?Ug^z*Ih}gx9L? zKVkz3t*=F^D_6BEbzOSr`9*7mIX6)UMrRpd0;(xWN#rw5vY}fT7>qQ8-JE|tm0E=D zZh%Csq!pvGG>qAvj$dYmv#*I`u8Iu~GB&*~NbKtirdfriSpxWfyB%Hf=l^w85~iKI zR>zt6n?`&=ae%SL>BrTvboGyIXPdYL1g%NJFyhu6j_BtxasS20Qw7NYMg%gGyV`2; zs?0JU+sQUxL`gG!Z&dqpv%Pyz_X}+-|DZ=@*OyQVEE-L6lku7f{PM6ehmPXjuBJv= zo%7@6YpsnH)m1oa8(ZtpkXgj(**lRaTEB<>>|h@!C-=R?zNt&8A#}$Y6oYB)C0+dr$WC5NAjt8|kbmhDg)2>?i81eFy35eaGef=m$XzG2i9h-fc&X z)TeOcF65xuhcItbzI{=v3P)ztE(|V|H<)b~Pu?w80UR0jhn=62G+h;!sR9P0Zb5&z zPluqzO=69wnyF^OuafYKoC%!Tt@He~`=-juak+()A0(MMqQyB}9QZ>ra^`W6tphLm z&6qMujPk$mVM{_<#s07{>|i09*HlL4Dl=>zpyo>f=B&By7bCP#XSq{!lJdIwgh{I% z(48S6R)OXJk89?g7Ok1GKGxmD8yx`|H8zBQzd)SQ=6ZqfjE^qdJPkX4p`IMe5pLI` z1XQG+-`kx%)Q)pUDOA&KEeO^ePpA*^ef{E1Z>+7L+`+F@A3-bSu5jDo!DEem5=;tv z-;BdCz{j`1a~&a@-F`-9c~#+R*>L%l?kVgN?m3rUC0m4Z_ZIpYD;N|@!{S!(EV7sH zIndIg=PqHo>-WU`LDgub?HNQ%4<4>AB;QPW9cO->CrzFJn=`)Q*fnx5^#^kwxnfc0 zq)Ql#P9e%;P}d-O7;7&JQA_bHT-e^P5%LQOktR*W3O-wi8>#Ydps2eYS+3mA3O-FO z#jZ@JtT-^&aj_$;9$_i^4}D6ZQO`WqHzF<1q4L@e7U)x2a4r zhGemhh6HgO6K-gy4xwrK+l9GtOF#6?Y3+O5X?_F9k3c)tm(B$p-c3 zS9ra!C{1mv(4A3%JVoHnl*tA0%lDPe<(soI540ri(86&_b!1waY-qP1SvmsDl~pr( z{$&U><{Euj4>(pf0A?}FW9-kdF;7jKD;;Pd`;Jh}J(O0S&9IwD`wtAvcW*4Qh! zkE{xNELn0p1iIChXrOvQlCLjry!NBZtNDd%4n%?4^ieK9Y?3;e889UsE!i`+oiL3f zouE6Fj0F!lHF|=|R0xcf0w$ovumcz(J(|--gVR1K6d?wC*I?XqVACmAQ?x@Y$PZR1 z0=tPW2|O{w@IL-nnb13w2l_`%dZ!pqnSIa4D!kGn4Aa{u-bwx=Yib&*WsT{}vi@Zt z|7%L3RR1$fM3hsK&ZmG^s#~uD0W^7Awn9k(q^2@MRJQiRHtb-Al)>Ilq5fBzn_9>} zk)O`JV$v^^8VhW{GBaZbcsjH&)Bl4Y|J|Z?%EC)zT?&t4*Vit8NicJ+XSY3uH+3$D z-r#Yk;zV<#*ScV^CFPZ~it}b~WcYim63i3bMZT|iCfNXWj_;rnoXgSOrVe!la$HV0 z@|4ofkNc15&u_v+~>FO`5Jsin*wNezA=9b zfK^GU2o{aDGj#XQASM7p;58ruSWj)V&;jbST`>>n2f1=-<+ZEeL`7ZC(EQ7yzKJLo{)ukuA6KNC3%c0az0K){ehB**HERB`ICV9VO-e0?$k+9 zUt)tCO{5U^uS@C&uUW7e?TeRTtQ%6fNQ@e!IAQSc*PT5gn&{>S()W+(fS!)pgNhfw}Zwl z^}1^CxKQ5ttVui=6B~uFBuPA3kzy{wM^1(S-f^{#lZs@W+K^@$pC_%HuKHNSIz?`1 zP8VwgDmN-!Dt@g~%HkQEL9IS-#p)py{JgrXVt%6|;%~rze}9W+X_X?O_D6GKN^`TX zBljD)kxg0CRvGImFt=t0>eQ+W1bG@>LUlq3C*qF8AbRcPO_@a7lF*BdrU@yfu80h1 zR4v>Jv-7y_zImD;18oiYAu@|tY|%E4_h$LJT>Z$^JON1Uenj}Zy=HpV6fU$Rp4a}E zKA$GL+7<$>0mpYKDb2Rlh+V1?keX5G9Ji!NMDG_0Jc zcE2`;1YE75ACiy}Z7t>rQE_akX!u-ov3~W;@q}Ghnvx}Ck@lU|;l=+xxDl3xSF`%? z4X-;#BDRWVj8Z86Gm@e)x=ESi^s0%c)lmx-fQNmC9XJhFNVN&0+k>+6Ry^||*IvVY z8Cc2Aqq)f20WAarlWypPUe(h;z}xbDtB(D|Fo`IY;B*YBeyC*FGf&0jt*7O-&+07p zLWd52!+j^ZxcEj_rax~hOXcsApcze(&|{Dg+|A9+72n-w&0#PoAp;}+0IvjKr}pRp z=jr^*u(z_WR{YPFXKq7 zZ<#)-F&-0Od1~}m&~;v{U<7RhRN3vO8`WM@^F%?LB9`@$R94l0BbT zs3w)e!Hw`OD&jOlSn>0;LN)Rs;q!PYr4L3g%+?>Et`4=_6sVQ{iJOcQ%N-*ZGcbwm zjY&gBJw>63nwKC;^Ty{13-N5t5F%{!P~ae%IAK7BS&=cCD?d?w{s%7$r(kNUJ)}-{ z>y!>hTSL!HdS1nPp;w$_lB{n{Nrt8+Et)`WX$`Iz38FF|WCJK=%%E~cg|}A7f^Yju zXZT=2^(_YuH2f)U$B8(}?vii`XY}0piArdPGb5WBpt#k;S-taZXtF$XySkU|#63DMjjLJIZ6^R<7U$HJUxA%t<>N9)|TWxBzr2GWAMXbx|w(IWc$CM^N zHs4ge%Wc9`2@^=jKewp=3Ng3_>ocn6m^PbWWS|X>KPsY!W75>8F4jcYZt?HpER`^e zO`4>DxRW}xQ_l3aw*h5;&E8ezmQ^i*>6>;f{X-A6@(h3KOGo~iNM7zS!7M-0z#9bA zun(ngUgfI&ZTq*>xt;EK{r8&Pn%8#_`>x1@Umc>alISMNm|q;4l*lS2eqs_5p5%7e zgS*%CtmK)ia&;5Ht(@>`X^+fV;N$6t@_l% zcvW#?bvNQgWC|3`EntPKkgSfb@k(XBicvYmtdw!Cfmqe^tnacT@PG2msJs}Wf(ryvjWlY*3X}L=E;c_ zf!Czymm92by)@Z7u$3ZaiJ;)no;lXfDg0}TKTGqB0NrX6-(#N8)1EUW_Kv?5s&kVR zcpe=RbV+?(g-)QTmoV6-a={F7w|yv%m$4Qyh|Pxfta6(;kYf^mH_mXI`sqOpf7u53 zEx_c?BD!1;0<7>6AR`vl=XSU^XPcZKk0X!oxpV|mJgC~-gGl2We) zba&*WS#$$P8-Gn(y*QRvl!K&CsKgv&5kzir^)@Pnf8;~on0KmxJXlvN^#36nW<}xk zN_jb-G!i9GxfXb$Cv7ks8opVDvgOww#I8cGLW=^K7oAVIt$q@7{#!%h0Cf3Y#KLyn z+$ty#GV6Aty78GMS(q)>E9*?#?>OiL|ABV!_LR^0Q1P{1L0ZT{d!8LUvji{)F!nSz zZTNoSL#5grXZ>VndeZ)Dg1G_}df|_8;?MIsJD@*7B#l_bhHHK-$=m&;L&3?#eak
!au44tp%1f-gnh@oZ;$9J`Aq|6>aCYe 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%0DigeD%cHx}x$S1c8BV*)!PHo40A!X% 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

m#XAgoF}FDp19ZqUj;DxC%?{nt5c*BG^? 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 literal 0 HcmV?d00001 diff --git a/docs/_static/s2s-IBL_frequency.png b/docs/_static/s2s_mid_lat-UserScript_fcstGFS_obsERA_Blocking.png similarity index 100% rename from docs/_static/s2s-IBL_frequency.png rename to docs/_static/s2s_mid_lat-UserScript_fcstGFS_obsERA_Blocking.png diff --git a/docs/_static/s2s-OBS_ERA_weather_regime.png b/docs/_static/s2s_mid_lat-UserScript_fcstGFS_obsERA_WeatherRegime.png similarity index 100% rename from docs/_static/s2s-OBS_ERA_weather_regime.png rename to docs/_static/s2s_mid_lat-UserScript_fcstGFS_obsERA_WeatherRegime.png diff --git a/docs/_static/s2s-OBS_ERA_blocking_frequency.png b/docs/_static/s2s_mid_lat-UserScript_obsERA_obsOnly_Blocking.png similarity index 100% rename from docs/_static/s2s-OBS_ERA_blocking_frequency.png rename to docs/_static/s2s_mid_lat-UserScript_obsERA_obsOnly_Blocking.png diff --git a/docs/_static/s2s-OBS_ERA_weather_regime_freq.png b/docs/_static/s2s_mid_lat-UserScript_obsERA_obsOnly_WeatherRegime.png similarity index 100% rename from docs/_static/s2s-OBS_ERA_weather_regime_freq.png rename to docs/_static/s2s_mid_lat-UserScript_obsERA_obsOnly_WeatherRegime.png diff --git a/docs/_static/s2s-OMI_GFS_phase_diagram.png b/docs/_static/s2s_mjo-UserScript_fcstGFS_obsERA_OMI.png similarity index 100% rename from docs/_static/s2s-OMI_GFS_phase_diagram.png rename to docs/_static/s2s_mjo-UserScript_fcstGFS_obsERA_OMI.png diff --git a/docs/_static/s2s-OMI_phase_diagram.png b/docs/_static/s2s_mjo-UserScript_obsERA_obsOnly_OMI.png similarity index 100% rename from docs/_static/s2s-OMI_phase_diagram.png rename to docs/_static/s2s_mjo-UserScript_obsERA_obsOnly_OMI.png diff --git a/docs/_static/s2s-PhaseDiagram.png b/docs/_static/s2s_mjo-UserScript_obsERA_obsOnly_PhaseDiagram.png similarity index 100% rename from docs/_static/s2s-PhaseDiagram.png rename to docs/_static/s2s_mjo-UserScript_obsERA_obsOnly_PhaseDiagram.png diff --git a/docs/_static/s2s-RMM_time_series.png b/docs/_static/s2s_mjo-UserScript_obsERA_obsOnly_RMM.png similarity index 100% rename from docs/_static/s2s-RMM_time_series.png rename to docs/_static/s2s_mjo-UserScript_obsERA_obsOnly_RMM.png diff --git a/docs/_static/convection_allowing_models-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png b/docs/_static/short_range-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png similarity index 100% rename from docs/_static/convection_allowing_models-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png rename to docs/_static/short_range-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png diff --git a/docs/_static/convection_allowing_models-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png b/docs/_static/short_range-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png similarity index 100% rename from docs/_static/convection_allowing_models-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png rename to docs/_static/short_range-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png diff --git a/docs/_static/convection_allowing_models-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png b/docs/_static/short_range-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png similarity index 100% rename from docs/_static/convection_allowing_models-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png rename to docs/_static/short_range-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png diff --git a/docs/_static/convection_allowing_models-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png b/docs/_static/short_range-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png similarity index 100% rename from docs/_static/convection_allowing_models-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png rename to docs/_static/short_range-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png diff --git a/docs/_static/convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTemp.png b/docs/_static/short_range-MODE_fcstFV3_obsGOES_BrightnessTemp.png similarity index 100% rename from docs/_static/convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTemp.png rename to docs/_static/short_range-MODE_fcstFV3_obsGOES_BrightnessTemp.png diff --git a/docs/_static/convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png b/docs/_static/short_range-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png similarity index 100% rename from docs/_static/convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png rename to docs/_static/short_range-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png diff --git a/docs/_static/convection_allowing_models-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png b/docs/_static/short_range-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png similarity index 100% rename from docs/_static/convection_allowing_models-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png rename to docs/_static/short_range-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png diff --git a/docs/_static/convection_allowing_models-MTD_fcstHREF_FcstOnly_Gempak.png b/docs/_static/short_range-MTD_fcstHREF_FcstOnly_Gempak.png similarity index 100% rename from docs/_static/convection_allowing_models-MTD_fcstHREF_FcstOnly_Gempak.png rename to docs/_static/short_range-MTD_fcstHREF_FcstOnly_Gempak.png diff --git a/docs/_static/convection_allowing_models-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png b/docs/_static/short_range-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png similarity index 100% rename from docs/_static/convection_allowing_models-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png rename to docs/_static/short_range-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png diff --git a/docs/_static/convection_allowing_models-SS_PP_prob.png b/docs/_static/short_range-SS_PP_prob.png similarity index 100% rename from docs/_static/convection_allowing_models-SS_PP_prob.png rename to docs/_static/short_range-SS_PP_prob.png diff --git a/docs/use_cases/model_applications/convection_allowing_models/README.rst b/docs/use_cases/model_applications/convection_allowing_models/README.rst deleted file mode 100644 index cde07319df..0000000000 --- a/docs/use_cases/model_applications/convection_allowing_models/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Convection Allowing Models --------------------------- -High resolution model configurations (1-4km) usually producing forecasts between 0-3 days (also referred to as limited area models, stand-alone regional, and short range weather applications) diff --git a/docs/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.py b/docs/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.py new file mode 100644 index 0000000000..79502d2b3e --- /dev/null +++ b/docs/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.py @@ -0,0 +1,144 @@ +""" +GridStat: Determine dominant ensemble members terciles and calculate categorical outputs +======================================================================================== + +model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf + +""" +############################################################################## +# Scientific Objective +# -------------------- +# This use case ingests a CFSv2 Ensemble forecast, with all ensemble members in a single file for a given year. +# 29 years of forecast ensembles are used to create probabilities for each tercile, which is accomplished by a Python script. +# Of the terciles, each gridpoint is assigned a value corresponding to the tercile that is most likely to occur. This is compared to an observation set +# that contains the tercile data and MCTS line type is requested. +# This use case highlights the inclusion of tercile data for calculating HSS; in particular, how to utilize the hss_ec_value option to +# preset the expected values rather than relying on categorical values. + +############################################################################## +# Datasets +# --------------------- +# +# | **Forecast:** 29 CFSv2 Ensemble files, 2m temperature fields +# +# | **Observations:** GHCNCAMS, 2m temperature field +# +# +# | **Location:** All of the input data required for this use case can be found in the met_test sample data tarball. Click here to 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. +# +# | **Data Source:** CPC + +############################################################################## +# METplus Components +# ------------------ +# +# This use case calls a Python script 29 times, once for each year of data of the CFSv2 ensemble. +# Each time a successful call to the script is made, a grid of 1s, 2s, and 3s is returned, representing which tercile was dominant for the gridpoint. +# GridStat processes the forecast and observation fields, and outputs the requested line types. + +############################################################################## +# METplus Workflow +# ---------------- +# +# This use case utilizes 29 years of forecast data, with 24 members in each ensemble forecast. +# The following boundary times are used for the entire script: +# +# | **Init Beg:** 1982-01-01 +# | **Init End:** 2010-01-02 +# +# Because the increment is 1 year, all January 1st from 1982 to 2010 are processed for a total of 29 years. +# + +############################################################################## +# 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. -c parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf +# + +############################################################################## +# MET Configuration +# --------------------- +# +# METplus sets environment variables based on the values in the METplus configuration file. These variables are referenced in the MET configuration file. **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 not controlled by an environment variable, you can add additional environment variables to be set only within the METplus environment using the [user_env_vars] section of the METplus configuration files. See the ‘User Defined Config’ section on the ‘System Configuration’ page of the METplus User’s Guide for more information. +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/met_config/GridStatConfig_wrapped +# + +############################################################################## +# Running METplus +# --------------- +# +# This use case can be run two ways: +# +# 1) Passing in GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf then a user-specific system configuration file:: +# +# run_metplus.py /path/to/METplus/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile /path/to/user_system.conf +# +# 2) Modifying the configurations in parm/metplus_config, then passing in GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile:: +# +# run_metplus.py /path/to/METplus/parm/use_cases/model_applications/marine_and_cryosphere/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf +# +# The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). This is not required to run METplus, but it is required to run the examples in parm/use_cases +# * **OUTPUT_BASE** - Path where METplus output will be written. This must be in a location where you have write permissions +# * **MET_INSTALL_DIR** - Path to location where MET is installed locally +# +# Example User Configuration File:: +# +# [config] +# INPUT_BASE = /path/to/sample/input/data +# OUTPUT_BASE = /path/to/output/dir +# MET_INSTALL_DIR = /path/to/met-X.Y +# +# + +############################################################################## +# 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 the use case will be found in 29 folders(relative to **OUTPUT_BASE**). +# The output will follow the time information of the run. Specifically: +# +# * YYYY01 +# +# where YYYY will be replaced by values corresponding to each of the years (1982 through 2010). +# Each of those folders will have the following files: +# +# * grid_stat_000000L_19820101_000000V_pairs.nc +# * grid_stat_000000L_19820101_000000V_mctc.txt +# * grid_stat_000000L_19820101_000000V_mcts.txt +# * grid_stat_000000L_19820101_000000V.stat +# + +############################################################################## +# Keywords +# -------- +# +# .. note:: +# +# * GridStatUseCase +# * ProbabilityVerificationUseCase +# * PythonEmbeddingFileUseCase +# * S2SAppUseCase +# * NETCDFFileUseCase +# +# Navigate to the :ref:`quick-search` page to discover other similar use cases. +# +# +# +# sphinx_gallery_thumbnail_path = '_static/s2s-GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.png' + diff --git a/docs/use_cases/model_applications/s2s_mid_lat/README.rst b/docs/use_cases/model_applications/s2s_mid_lat/README.rst new file mode 100644 index 0000000000..237d4e1f88 --- /dev/null +++ b/docs/use_cases/model_applications/s2s_mid_lat/README.rst @@ -0,0 +1,3 @@ +Subseasonal to Seasonal: Mid-Latitude +------------------------------------- +Subseasonal-to-Seasonal model configurations relating to middle latitudes diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.py similarity index 92% rename from docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py rename to docs/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.py index 0c14caa9da..bfe001699e 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.py @@ -3,7 +3,7 @@ ======================================================================================== model_applications/ -s2s/ +s2s_mid_lat/ UserScript_fcstGFS_obsERA_Blocking.py """ @@ -82,13 +82,13 @@ # # 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/s2s/UserScript_fcstGFS_obsERA_Blocking.py. +# i.e. parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.py. # The file UserScript_fcstGFS_obsERA_Blocking.conf runs the python program, and the # variables for all steps of the Blocking calculation are given in the [user_env_vars] # section of the .conf file. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.conf # ############################################################################## @@ -112,7 +112,7 @@ # # This use case uses Python scripts to perform the blocking calculation # -# parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py: +# parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py: # This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible # steps are computing CBLs, plotting CBLs, computing IBLs, plotting IBLs, computing GIBLs, computing blocks, and # plotting blocks. @@ -127,7 +127,7 @@ # pre-processing steps. See the METcalcpy `Utility script `_ for more information. # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py # ############################################################################## @@ -138,11 +138,11 @@ # # 1) Passing in UserScript_fcstGFS_obsERA_Blocking.py then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.py -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_fcstGFS_obsERA_Blocking.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.py # # The following variables must be set correctly: # @@ -163,7 +163,7 @@ # --------------- # # 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 model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) and will contain output +# case will be found in model_applications/s2s_mid_lat/Blocking (relative to **OUTPUT_BASE**) and will contain output # for the steps requested. This may include the regridded data, daily averaged files, running mean files, # and anomaly files. In addition, output CBL, IBL, and Blocking frequency plots can be generated. The location # of these output plots can be specified as BLOCKING_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent @@ -184,6 +184,7 @@ # * PCPCombineUseCase # * StatAnalysisUseCase # * S2SAppUseCase +# * S2SMidLatAppUseCase # * NetCDFFileUseCase # * GRIB2FileUseCase # @@ -191,4 +192,4 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/s2s-IBL_frequency.png' +# sphinx_gallery_thumbnail_path = '_static/s2s_mid_lat-UserScript_fcstGFS_obsERA_Blocking.png' diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.py b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.py similarity index 92% rename from docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.py rename to docs/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.py index ac4abf5549..90a3adea2d 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.py @@ -3,7 +3,7 @@ ================================================================================================== model_applications/ -s2s/ +s2s_mid_lat/ UserScript_fcstGFS_obsERA_WeatherRegime.py """ @@ -93,12 +93,12 @@ # # 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/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.py. +# i.e. parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.py. # The file UserScript_fcstGFS_obsERA_WeatherRegime.conf runs the python program and # sets the variables for all steps of the Weather Regime use case including data paths. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.conf # ############################################################################## @@ -121,7 +121,7 @@ # # This use case uses Python scripts to perform the blocking calculation # -# parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py: +# parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py: # This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible # steps are computing the elbow, computing EOFs, and computing weather regimes using k means clustering. # @@ -135,7 +135,7 @@ # pre-processing steps. See the METcalcpy `Utility script `_ for more information. # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py # ############################################################################## @@ -146,11 +146,11 @@ # # 1) Passing in UserScript_fcstGFS_obsERA_WeatherRegime.py then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.py -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.py -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_fcstGFS_obsERA_WeatherRegime.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.py +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.py # # The following variables must be set correctly: # @@ -171,7 +171,7 @@ # --------------- # # 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 model_applications/s2s/WeatherRegime (relative to **OUTPUT_BASE**) and will contain output +# case will be found in model_applications/s2s_mid_lat/WeatherRegime (relative to **OUTPUT_BASE**) and will contain output # for the steps requested. This may include the regridded data, daily averaged files, a text file containing the # list of input files, and text files for the weather regime classification and time frequency (if KMEANS and # TIMEFREQ are run for both the forecast and observation data). In addition, output elbow, EOF, and Kmeans weather @@ -193,6 +193,7 @@ # * PCPCombineUseCase # * StatAnalysisUseCase # * S2SAppUseCase +# * S2SMidLatAppUseCase # * NetCDFFileUseCase # * GRIB2FileUseCase # @@ -200,4 +201,4 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/s2s-OBS_ERA_weather_regime.png' +# sphinx_gallery_thumbnail_path = '_static/s2s_mid_lat-UserScript_fcstGFS_obsERA_WeatherRegime.png' diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.py similarity index 92% rename from docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py rename to docs/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.py index 065a96570c..44987edbc1 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py +++ b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.py @@ -3,7 +3,7 @@ ================================================================================ model_applications/ -s2s/ +s2s_mid_lat/ UserScript_obsERA_obsOnly_Blocking.py """ @@ -83,13 +83,13 @@ # # 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/s2s/UserScript_obsERA_obsOnly_Blocking.py. +# i.e. parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.py. # The file UserScript_obsERA_obsOnly_Blocking.conf runs the python program, and the # variables for all steps of the Blocking use case are set in the [user_env_vars] # section. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.conf # ############################################################################## @@ -111,7 +111,7 @@ # # This use case uses Python scripts to perform the blocking calculation # -# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py: +# parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py: # This script calls the requested steps in the blocking analysis for a forecast, observation, or both. # # metcalcpy/contributed/blocking_weather_regime/Blocking.py: @@ -124,7 +124,7 @@ # pre-processing steps. See the METcalcpy `Utility script `_ for more information. # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py # ############################################################################## @@ -135,11 +135,11 @@ # # 1) Passing in UserScript_obsERA_obsOnly_Blocking.py then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.py -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_Blocking.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.py # # The following variables must be set correctly: # @@ -160,7 +160,7 @@ # --------------- # # 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 model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) and will contain output +# case will be found in model_applications/s2s_mid_lat/Blocking (relative to **OUTPUT_BASE**) and will contain output # for the steps requested. This may include the regridded data, daily averaged files, running mean files, # and anomaly files. In addition, output CBL, IBL, and Blocking frequency plots can be generated. The location # of these output plots can be specified as BLOCKING_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent @@ -178,6 +178,7 @@ # * RegridDataPlaneUseCase # * PCPCombineUseCase # * S2SAppUseCase +# * S2SMidLatAppUseCase # * NetCDFFileUseCase # * GRIB2FileUseCase # @@ -185,5 +186,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/s2s-OBS_ERA_blocking_frequency.png' +# sphinx_gallery_thumbnail_path = '_static/s2s_mid_lat-UserScript_obsERA_obsOnly_Blocking.png' # diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.py similarity index 92% rename from docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py rename to docs/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.py index 3cb9520456..91d88bc7b1 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -3,7 +3,7 @@ ========================================================================================== model_applications/ -s2s/ +s2s_mid_lat/ UserScript_obsERA_obsOnly_WeatherRegime.py """ @@ -92,12 +92,12 @@ # # 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/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py. +# i.e. parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.py. # The file UserScript_obsERA_obsOnly_WeatherRegime.conf runs the python program and # sets the variables for all steps of the Weather Regime use case including data paths. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.conf # ############################################################################## @@ -120,7 +120,7 @@ # # This use case uses Python scripts to perform the blocking calculation # -# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py: +# parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py: # This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible # steps are computing the elbow, computing EOFs, and computing weather regimes using k means clustering. # @@ -134,7 +134,7 @@ # pre-processing steps. See the METcalcpy `Utility script `_ for more information. # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py # ############################################################################## @@ -145,11 +145,11 @@ # # 1) Passing in UserScript_obsERA_obsOnly_WeatherRegime.py then a user-specific system configuration file:: # -# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py -c /path/to/user_system.conf +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.py -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_WeatherRegime.py:: # -# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.py # # The following variables must be set correctly: # @@ -170,7 +170,7 @@ # --------------- # # 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 model_applications/s2s/WeatherRegime (relative to **OUTPUT_BASE**) and will contain output +# case will be found in model_applications/s2s_mid_lat/WeatherRegime (relative to **OUTPUT_BASE**) and will contain output # for the steps requested. This may include the regridded data, daily averaged files, a text file containing the # list of input files, and text files for the weather regime classification and time frequency (if KMEANS and # TIMEFREQ are run for both the forecast and observation data). In addition, output elbow, EOF, and Kmeans weather @@ -192,6 +192,7 @@ # * PCPCombineUseCase # * StatAnalysisUseCase # * S2SAppUseCase +# * S2SMidLatAppUseCase # * NetCDFFileUseCase # * GRIB2FileUseCase # @@ -199,4 +200,4 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/s2s-OBS_ERA_weather_regime_freq.png' +# sphinx_gallery_thumbnail_path = '_static/s2s_mid_lat-UserScript_obsERA_obsOnly_WeatherRegime.png' diff --git a/docs/use_cases/model_applications/s2s_mjo/README.rst b/docs/use_cases/model_applications/s2s_mjo/README.rst new file mode 100644 index 0000000000..63a14664f3 --- /dev/null +++ b/docs/use_cases/model_applications/s2s_mjo/README.rst @@ -0,0 +1,3 @@ +Subseasonal to Seasonal: Madden-Julian Oscillation +-------------------------------------------------- +Subseasonal-to-Seasonal model configurations relating to the Madden-Julian oscillation diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.py b/docs/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.py similarity index 87% rename from docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.py rename to docs/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.py index 201e41d96e..64cacbe08d 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.py +++ b/docs/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.py @@ -1,9 +1,9 @@ """ UserScript: Make OMI plot from calculated MJO indices -=========================================================================== +===================================================== model_applications/ -s2s/ +s2s_mjo/ UserScript_fcstGFS_obsERA_OMI.py """ @@ -63,12 +63,12 @@ # # 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/s2s/UserScript_fcstGFS_obsERA_OMI.conf. +# i.e. parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf. # The file UserScript_fcstGFS_obsERA_OMI/OMI_driver.py runs the python program and # UserScript_fcstGFS_obsERA_OMI.conf sets the variables for all steps of the OMI use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf ############################################################################## # MET Configuration @@ -85,10 +85,10 @@ # # The OMI driver script orchestrates the calculation of the MJO indices and # the generation of a phase diagram OMI plot: -# parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py: +# parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py: # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py # ############################################################################## @@ -99,11 +99,11 @@ # # 1) Passing in UserScript_fcstGFS_obsERA_OMI.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_fcstGFS_obsERA_OMI.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf # # The following variables must be set correctly: # @@ -123,7 +123,7 @@ # Expected Output # --------------- # -# 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 model_applications/s2s/UserScript_fcstGFS_obsERA_OMI. This may include the regridded data and daily averaged files. In addition, the phase diagram plots will be generated and the output location can be specified as OMI_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/plots (relative to **OUTPUT_BASE**). +# 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 model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI. This may include the regridded data and daily averaged files. In addition, the phase diagram plots will be generated and the output location can be specified as OMI_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/plots (relative to **OUTPUT_BASE**). ############################################################################## # Keywords @@ -132,10 +132,11 @@ # .. note:: # # * S2SAppUseCase +# * S2SMJOAppUseCase # * RegridDataPlaneUseCase # * PCPCombineUseCase # # Navigate to :ref:`quick-search` to discover other similar use cases. # -# sphinx_gallery_thumbnail_path = '_static/s2s-OMI_GFS_phase_diagram.png' +# sphinx_gallery_thumbnail_path = '_static/s2s_mjo-UserScript_fcstGFS_obsERA_OMI.png' # diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.py b/docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.py similarity index 86% rename from docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.py rename to docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.py index 90450b8134..2c95d3031b 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.py +++ b/docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.py @@ -1,9 +1,9 @@ """ UserScript: Make OMI plot from calculated MJO indices -=========================================================================== +===================================================== model_applications/ -s2s/ +s2s_mjo/ UserScript_obsERA_obsOnly_OMI.py """ @@ -63,12 +63,12 @@ # # 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/s2s/UserScript_obsERA_obsOnly_OMI.conf. +# i.e. parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf. # The file UserScript_obsERA_obsOnly_OMI/OMI_driver.py runs the python program and # UserScript_fcstGFS_obsERA_OMI.conf sets the variables for all steps of the OMI use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf ############################################################################## # MET Configuration @@ -85,10 +85,10 @@ # # The OMI driver script orchestrates the calculation of the MJO indices and # the generation of a phase diagram OMI plot: -# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/OMI_driver.py: +# parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/OMI_driver.py: # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/OMI_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/OMI_driver.py # ############################################################################## @@ -99,11 +99,11 @@ # # 1) Passing in UserScript_obsERA_obsOnly_OMI.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_OMI.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf # # The following variables must be set correctly: # @@ -123,7 +123,7 @@ # Expected Output # --------------- # -# 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 model_applications/s2s/UserScript_obsERA_obsOnly_OMI. This may include the regridded data and daily averaged files. In addition, the phase diagram plots will be generated and the output location can be specified as OMI_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s/UserScript_obsERA_obsOnly_OMI/plots (relative to **OUTPUT_BASE**). +# 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 model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI. This may include the regridded data and daily averaged files. In addition, the phase diagram plots will be generated and the output location can be specified as OMI_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/plots (relative to **OUTPUT_BASE**). ############################################################################## # Keywords @@ -132,10 +132,11 @@ # .. note:: # # * S2SAppUseCase +# * S2SMJOAppUseCase # * RegridDataPlaneUseCase # * PCPCombineUseCase # # Navigate to :ref:`quick-search` to discover other similar use cases. # -# sphinx_gallery_thumbnail_path = '_static/s2s-OMI_phase_diagram.png' -# \ No newline at end of file +# sphinx_gallery_thumbnail_path = '_static/s2s_mjo-UserScript_obsERA_obsOnly_OMI.png' +# diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.py b/docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.py similarity index 83% rename from docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.py rename to docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.py index 3266d628dd..7d27c127d0 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.py +++ b/docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.py @@ -1,9 +1,9 @@ """ UserScript: Make a Phase Diagram plot from input RMM or OMI -=========================================================================== +=========================================================== model_applications/ -s2s/ +s2s_mjo/ UserScript_obsERA_obsOnly_PhaseDiagram.py """ @@ -63,13 +63,13 @@ # # 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/s2s/UserScript_obsERA_obsERA_OMI.conf. +# i.e. parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsERA_OMI.conf. # The file UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py runs the python # program and UserScript_obsERA_obsOnly_PhaseDiagram.conf sets the variables for all steps # of the use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf ############################################################################## # MET Configuration @@ -84,11 +84,11 @@ # ---------------- # # The phase diagram driver script orchestrates the generation of a phase diagram plot: -# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/PhaseDiagram_driver.py: +# parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/PhaseDiagram_driver.py: # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py # ############################################################################## @@ -99,11 +99,11 @@ # # 1) Passing in UserScript_obsERA_obsOnly_PhaseDiagram.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_PhaseDiagram.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf # # The following variables must be set correctly: # @@ -123,7 +123,7 @@ # Expected Output # --------------- # -# 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 model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram. This may include the regridded data and daily averaged files. In addition, the phase diagram plots will be generated and the output location can be specified as PHASE_DIAGRAM_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/plots (relative to **OUTPUT_BASE**). +# 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 model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram. This may include the regridded data and daily averaged files. In addition, the phase diagram plots will be generated and the output location can be specified as PHASE_DIAGRAM_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/plots (relative to **OUTPUT_BASE**). ############################################################################## # Keywords @@ -133,8 +133,9 @@ # .. note:: # # * S2SAppUseCase +# * S2SMJOAppUseCase # # Navigate to :ref:`quick-search` to discover other similar use cases. # -# sphinx_gallery_thumbnail_path = '_static/s2s-PhaseDiagram.png' -# \ No newline at end of file +# sphinx_gallery_thumbnail_path = '_static/s2s_mjo-UserScript_obsERA_obsOnly_PhaseDiagram.png' +# diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.py b/docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.py similarity index 85% rename from docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.py rename to docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.py index 6c4f3e5c6c..15e2b7446f 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.py +++ b/docs/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.py @@ -1,9 +1,9 @@ """ UserScript: Make RMM plots from calculated MJO indices -=========================================================================== +====================================================== model_applications/ -s2s/ +s2s_mjo/ UserScript_obsERA_obsOnly_RMM.py """ @@ -63,12 +63,12 @@ # # 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/s2s/UserScript_obsERA_obsOnly_RMM.conf. +# i.e. parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf. # The file UserScript_obsERA_obsOnly_RMM/RMM_driver.py runs the python program and # UserScript_obsERA_obsOnly_RMM.conf sets the variables for all steps of the RMM use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf ############################################################################## # MET Configuration @@ -85,13 +85,13 @@ # # The RMM driver script orchestrates the calculation of the MJO indices and # the generation of three RMM plots: -# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/RMM_driver.py: +# parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/RMM_driver.py: # The harmonic anomalies script creates anomalies of input data using a harmonic analysis: -# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py +# parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/RMM_driver.py -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/RMM_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py # ############################################################################## @@ -102,11 +102,11 @@ # # 1) Passing in UserScript_obsERA_obsOnly_RMM.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_RMM.py:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf # # The following variables must be set correctly: # @@ -126,7 +126,7 @@ # Expected Output # --------------- # -# 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 model_applications/s2s/UserScript_obsERA_obsOnly_RMM. This may include the regridded data and daily averaged files. In addition, three plots will be generated, a phase diagram, time series, and EOF plot, and the output location can be specified as RMM_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s/UserScript_obsERA_obsOnly_RMM/plots (relative to **OUTPUT_BASE**). +# 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 model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM. This may include the regridded data and daily averaged files. In addition, three plots will be generated, a phase diagram, time series, and EOF plot, and the output location can be specified as RMM_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent to model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/plots (relative to **OUTPUT_BASE**). # ############################################################################## @@ -137,11 +137,12 @@ # .. note:: # # * S2SAppUseCase +# * S2SMJOAppUseCase # * NetCDFFileUseCase # * RegridDataPlaneUseCase # * PCPCombineUseCase # # Navigate to :ref:`quick-search` to discover other similar use cases. # -# sphinx_gallery_thumbnail_path = '_static/s2s-RMM_time_series.png' -# \ No newline at end of file +# sphinx_gallery_thumbnail_path = '_static/s2s_mjo-UserScript_obsERA_obsOnly_RMM.png' +# diff --git a/docs/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py b/docs/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py similarity index 90% rename from docs/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py rename to docs/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py index 78cc9bd9d3..9b175c0e06 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py +++ b/docs/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.py @@ -3,7 +3,7 @@ ======================================================== model_applications/ -convection_allowing_models/ +short_range/ EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf """ @@ -64,10 +64,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf ############################################################################## # MET Configuration @@ -94,11 +94,11 @@ # # 1) Passing in EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -125,7 +125,7 @@ # 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 model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/EnsembleStat/201807091200 (relative to **OUTPUT_BASE**) +# Output for this use case will be found in model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/EnsembleStat/201807091200 (relative to **OUTPUT_BASE**) # and will contain the following files: # # * ensemble_stat_HRRRE_F000_ADPSFC_20180709_120000V_ecnt.txt @@ -162,7 +162,7 @@ # .. note:: # # * EnsembleStatToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * PB2NCToolUseCase # * prepBUFRFileUseCase # * GRIB2FileUseCase @@ -178,4 +178,4 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.png' diff --git a/docs/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py b/docs/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py similarity index 93% rename from docs/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py rename to docs/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py index f697a3101c..2eb3b906d6 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py +++ b/docs/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.py @@ -2,10 +2,10 @@ Surrogate Severe Calculation: PCPCombine, EnsembleStat, and RegridDataPlane =================================================================================================== -model_applications/\ -convection_allowing_model/\ -EnsembleStat_fcstHRRR_fcstOnly_\ -SurrogateSevere.conf +model_applications/ +short_range/ +EnsembleStat_fcstHRRR_fcstOnly +_SurrogateSevere.conf """ ################################################################################################### @@ -62,7 +62,7 @@ # any configuration files passed to METplus by the command line with the -c option. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf ################################################################################################### # MET Configuration @@ -87,7 +87,7 @@ # # The command to run this use case is:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf ################################################################################################### # Expected Output @@ -128,5 +128,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py b/docs/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py similarity index 89% rename from docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py rename to docs/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py index 21f3115304..27c9d36225 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py +++ b/docs/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.py @@ -3,7 +3,7 @@ ========================================================================= model_applications/ -convection_allowing_model/ +short_range/ GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf """ @@ -50,10 +50,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf ############################################################################## # MET Configuration @@ -80,11 +80,11 @@ # # 1) Passing in GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -111,7 +111,7 @@ # 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 convection_allowing_models/brightness_temperature +# Output for this use case will be found in short_range/brightness_temperature # (relative to **OUTPUT_BASE**) and will contain the following files: # # grid_stat/grid_stat_FV3_core_lsm1_000000L_20190521_010000V_dmap.txt @@ -135,7 +135,7 @@ # .. note:: # # * GridStatToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NetCDFFileUseCase # * NOAAEMCOrgUseCase # * NOAAHWTOrgUseCase @@ -145,5 +145,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-GridStat_fcstFV3_obsGOES_BrightnessTempDmap.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py b/docs/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py similarity index 87% rename from docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py rename to docs/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py index 56c4c7c51a..7774241dd6 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py +++ b/docs/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.py @@ -3,7 +3,7 @@ ============================================================== model_applications/ -convection_allowing_model/ +short_range/ GridStat_fcstHRRR_obsPracPerfect _SurrogateSevere.conf @@ -48,10 +48,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf ############################################################################## # MET Configuration @@ -78,11 +78,11 @@ # # 1) Passing in GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -108,7 +108,7 @@ # 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 model_applications/convection_allowing_models/surrogate_severe_prac_perfect/grid_stat (relative to **OUTPUT_BASE**) +# Output for this use case will be found in model_applications/short_range/surrogate_severe_prac_perfect/grid_stat (relative to **OUTPUT_BASE**) # and will contain the following files: # # grid_stat_360000L_20200206_120000V_ctc.txt @@ -124,7 +124,7 @@ # .. note:: # # * GridStatToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NetCDFFileUseCase # * NOAAHWTOrgUseCase # * NCAROrgUseCase @@ -133,4 +133,4 @@ # Navigate to the :ref:`quick-search` page to discover other similar use cases. # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-SS_PP_prob.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-SS_PP_prob.png' diff --git a/docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py b/docs/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py similarity index 87% rename from docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py rename to docs/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py index 71d4e76afa..7a2a3546d4 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py +++ b/docs/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.py @@ -3,7 +3,7 @@ ============================================================================ model_applications/ -convection_allowing_models/ +short_range/ GridStat_fcstHRRR_obsPracPerfect _SurrogateSevereProb.conf @@ -50,10 +50,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf ############################################################################## # MET Configuration @@ -80,11 +80,11 @@ # # 1) Passing in GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -110,7 +110,7 @@ # 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 model_applications/convection_allowing_models/surrogate_severe_prac_perfect/grid_stat/prob (relative to **OUTPUT_BASE**) +# Output for this use case will be found in model_applications/short_range/surrogate_severe_prac_perfect/grid_stat/prob (relative to **OUTPUT_BASE**) # and will contain the following files: # # grid_stat_360000L_20200206_120000V_pct.txt @@ -127,7 +127,7 @@ # .. note:: # # * GridStatToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NetCDFFileUseCase # * NOAAHWTOrgUseCase # * NCAROrgUseCase @@ -137,5 +137,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-SS_PP_prob.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-SS_PP_prob.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py b/docs/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py similarity index 91% rename from docs/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py rename to docs/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py index cb845d0a81..22571027ab 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py +++ b/docs/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.py @@ -3,7 +3,7 @@ ================================= model_applications/ -convection_allowing_model/ +short_range/ METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf """ @@ -59,7 +59,7 @@ # then it loads any configuration files passed to METplus via the command line # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf ############################################################################## # XML Configuration @@ -86,11 +86,11 @@ # # 1) Passing in METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf followed by a user-specific system configuration file:: # -# run_metplus.py /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf /path/to/user_system.conf +# run_metplus.py /path/to/METplus/parm/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config and then passing in METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf:: # -# run_metplus.py /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf +# run_metplus.py /path/to/METplus/parm/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -128,7 +128,7 @@ # .. note:: # # * METdbLoadUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NOAAEMCOrgUseCase # * NOAAHWTOrgUseCase # @@ -136,5 +136,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-METdbLoad_fcstFV3_obsGoes_BrightnessTemp.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.py b/docs/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.py similarity index 90% rename from docs/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.py rename to docs/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.py index aa3f143ec7..712d14ab4e 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.py +++ b/docs/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.py @@ -3,7 +3,7 @@ ========================================================================= model_applications/ -convection_allowing_model/ +short_range/ MODE_fcstFV3_obsGOES_BrightnessTemp.conf """ @@ -50,10 +50,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf ############################################################################## # MET Configuration @@ -80,11 +80,11 @@ # # 1) Passing in MODE_fcstFV3_obsGOES_BrightnessTemp.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in MODE_fcstFV3_obsGOES_BrightnessTemp.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -111,7 +111,7 @@ # 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 convection_allowing_models/brightness_temperature +# Output for this use case will be found in short_range/brightness_temperature # (relative to **OUTPUT_BASE**) and will contain the following files: # # mode_FV3_core_lsm1_010000L_20190521_010000V_NAA_cts.txt @@ -141,7 +141,7 @@ # # * MODEToolUseCase # * MODEToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NetCDFFileUseCase # * NOAAEMCOrgUseCase # * NOAAHWTOrgUseCase @@ -151,5 +151,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTemp.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-MODE_fcstFV3_obsGOES_BrightnessTemp.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py b/docs/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py similarity index 92% rename from docs/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py rename to docs/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py index f08803fae7..3fbf634497 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py +++ b/docs/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.py @@ -3,7 +3,7 @@ ========================================================================= model_applications/ -convection_allowing_model/ +short_range/ MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf """ @@ -52,10 +52,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf ############################################################################## # MET Configuration @@ -87,11 +87,11 @@ # # 1) Passing in MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -118,7 +118,7 @@ # 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 convection_allowing_models/brightness_temperature +# Output for this use case will be found in short_range/brightness_temperature # (relative to **OUTPUT_BASE**) and will contain the following files: # # mode/mode_FV3_core_lsm1_010000L_20190521_010000V_NAA_cts.txt @@ -163,7 +163,7 @@ # # * MODEToolUseCase # * GridStatToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NetCDFFileUseCase # * NOAAEMCOrgUseCase # * NOAAHWTOrgUseCase @@ -173,5 +173,5 @@ # # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-MODE_fcstFV3_obsGOES_BrightnessTempObjs.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py b/docs/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py similarity index 91% rename from docs/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py rename to docs/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py index 3828d5c7e3..374e84056a 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py +++ b/docs/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.py @@ -3,7 +3,7 @@ ========================================================================= model_applications/ -convection_allowing_model/ +short_range/ MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf """ @@ -55,10 +55,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf ############################################################################## # MET Configuration @@ -85,11 +85,11 @@ # # 1) Passing in MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -137,7 +137,7 @@ # .. note:: # # * MODEToolUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * GRIB2FileUseCase # * RegriddingInToolUseCase # * NOAAHWTOrgUseCase @@ -148,5 +148,5 @@ # Navigate to the :ref:`quick-search` page to discover other similar use cases. # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-MODE_fcstHRRRE_obsMRMS_Hail_GRIB2.png' # diff --git a/docs/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py b/docs/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py similarity index 85% rename from docs/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py rename to docs/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py index cb1c964e5b..6ee80ca011 100644 --- a/docs/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py +++ b/docs/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.py @@ -3,7 +3,7 @@ ============================================================ model_applications/ -convection_allowing_models/ +short_range/ Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf """ @@ -56,10 +56,10 @@ # # 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 -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf # ############################################################################## @@ -84,10 +84,10 @@ # # This use case uses a Python embedding script to read input data # -# parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py +# parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py # # .. highlight:: python -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py # ############################################################################## @@ -98,11 +98,11 @@ # # 1) Passing in EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf then a user-specific system configuration file:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf -c /path/to/user_system.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf -c /path/to/user_system.conf # # 2) Modifying the configurations in parm/metplus_config, then passing in EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf:: # -# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf +# run_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf # # The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: # @@ -129,7 +129,7 @@ # 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 model_applications/convection_allowing_models/practically_perfect/ (relative to **OUTPUT_BASE**) +# Output for this use case will be found in model_applications/short_range/practically_perfect/ (relative to **OUTPUT_BASE**) # and will contain the following files: # # * StormReps_211_Probs.20200205.nc @@ -148,7 +148,7 @@ # * RegriddingInToolUseCase # * NetCDFFileUseCase # * PythonEmbeddingFileUseCase -# * ConvectionAllowingModelsAppUseCase +# * ShortRangeAppUseCase # * NCAROrgUseCase # * ProbabilityGenerationUseCase # * MaskingFeatureUseCase @@ -158,4 +158,4 @@ # Navigate to the :ref:`quick-search` page to discover other similar use cases. # # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png' +# sphinx_gallery_thumbnail_path = '_static/short_range-Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.png' diff --git a/docs/use_cases/model_applications/short_range/README.rst b/docs/use_cases/model_applications/short_range/README.rst new file mode 100644 index 0000000000..2c004dcf97 --- /dev/null +++ b/docs/use_cases/model_applications/short_range/README.rst @@ -0,0 +1,3 @@ +Short Range +----------- +High resolution model configurations (1-4km) usually producing forecasts between 0-3 days (also referred to as limited area models, stand-alone regional, and short range weather applications); Previously named Convection Allowing Models diff --git a/internal_tests/pytests/plotting/make_plots/test_make_plots_wrapper.py b/internal_tests/pytests/plotting/make_plots/test_make_plots_wrapper.py index f1a2e54d32..2be97153a6 100644 --- a/internal_tests/pytests/plotting/make_plots/test_make_plots_wrapper.py +++ b/internal_tests/pytests/plotting/make_plots/test_make_plots_wrapper.py @@ -1,47 +1,14 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 -import os -import datetime -import sys -import logging import pytest -import datetime -import produtil.setup +import os from metplus.wrappers.make_plots_wrapper import MakePlotsWrapper -from metplus.util import met_util as util - -# -# These are tests (not necessarily unit tests) for the -# wrapper to make plots, make_plots_wrapper.py -# NOTE: This test requires pytest, which is NOT part of the standard Python -# library. -# These tests require one configuration file in addition to the three -# required METplus configuration files: test_make_plots.conf. This contains -# the information necessary for running all the tests. Each test can be -# customized to replace various settings if needed. -# - -# -# -----------Mandatory----------- -# configuration and fixture to support METplus configuration files beyond -# the metplus_data, metplus_system, and metplus_runtime conf files. -# +METPLUS_BASE = os.getcwd().split('/internal_tests')[0] -# Add a test configuration -def pytest_addoption(parser): - parser.addoption("-c", action="store", help=" -c ") -# @pytest.fixture -def cmdopt(request): - return request.config.getoption("-c") - -# -# ------------Pytest fixtures that can be used for all tests --------------- -# -#@pytest.fixture def make_plots_wrapper(metplus_config): """! Returns a default MakePlotsWrapper with /path/to entries in the metplus_system.conf and metplus_runtime.conf configuration @@ -55,35 +22,8 @@ def make_plots_wrapper(metplus_config): config = metplus_config(extra_configs) return MakePlotsWrapper(config) -# ------------------TESTS GO BELOW --------------------------- -# - -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# To test numerous files for filesize, use parametrization: -# @pytest.mark.parametrize( -# 'key, value', [ -# ('/usr/local/met-6.1/bin/point_stat', 382180), -# ('/usr/local/met-6.1/bin/stat_analysis', 3438944), -# ('/usr/local/met-6.1/bin/pb2nc', 3009056) -# -# ] -# ) -# def test_file_sizes(key, value): -# st = stat_analysis_wrapper() -# # Retrieve the value of the class attribute that corresponds -# # to the key in the parametrization -# files_in_dir = [] -# for dirpath, dirnames, files in os.walk("/usr/local/met-6.1/bin"): -# for name in files: -# files_in_dir.append(os.path.join(dirpath, name)) -# if actual_key in files_in_dir: -# # The actual_key is one of the files of interest we retrieved from -# # the output directory. Verify that it's file size is what we -# # expected. -# assert actual_key == key -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -METPLUS_BASE = os.getcwd().split('/internal_tests')[0] +@pytest.mark.plotting def test_get_command(metplus_config): # Independently test that the make_plots python # command is being put together correctly with @@ -98,6 +38,8 @@ def test_get_command(metplus_config): test_command = mp.get_command() assert(expected_command == test_command) + +@pytest.mark.plotting def test_create_c_dict(metplus_config): # Independently test that c_dict is being created # and that the wrapper and config reader diff --git a/internal_tests/pytests/plotting/plot_util/test_plot_util.py b/internal_tests/pytests/plotting/plot_util/test_plot_util.py index 386c584bb4..d22ce6b7aa 100644 --- a/internal_tests/pytests/plotting/plot_util/test_plot_util.py +++ b/internal_tests/pytests/plotting/plot_util/test_plot_util.py @@ -1,48 +1,23 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +import pytest import os -import datetime import sys -import logging -import pytest import datetime +import logging + import numpy as np import pandas as pd -import produtil.setup -# ------------------TESTS GO BELOW --------------------------- -# - -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# To test numerous files for filesize, use parametrization: -# @pytest.mark.parametrize( -# 'key, value', [ -# ('/usr/local/met-6.1/bin/point_stat', 382180), -# ('/usr/local/met-6.1/bin/stat_analysis', 3438944), -# ('/usr/local/met-6.1/bin/pb2nc', 3009056) -# -# ] -# ) -# def test_file_sizes(key, value): -# st = stat_analysis_wrapper() -# # Retrieve the value of the class attribute that corresponds -# # to the key in the parametrization -# files_in_dir = [] -# for dirpath, dirnames, files in os.walk("/usr/local/met-6.1/bin"): -# for name in files: -# files_in_dir.append(os.path.join(dirpath, name)) -# if actual_key in files_in_dir: -# # The actual_key is one of the files of interest we retrieved from -# # the output directory. Verify that it's file size is what we -# # expected. -# assert actual_key == key -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! METPLUS_BASE = os.getcwd().split('/internal_tests')[0] sys.path.append(METPLUS_BASE+'/ush/plotting_scripts') import plot_util logger = logging.getLogger('~/metplus_pytest_plot_util.log') + +@pytest.mark.plotting def test_get_date_arrays(): # Independently test the creation of # the date arrays, one used for plotting @@ -209,6 +184,8 @@ def test_get_date_arrays(): assert(test_expected_stat_file_dates[l] == expected_expected_stat_file_dates[l]) + +@pytest.mark.plotting def test_format_thresh(): # Independently test the formatting # of thresholds @@ -297,6 +274,8 @@ def test_format_thresh(): assert(test_thresh_symbol == expected_thresh_symbol) assert(test_thresh_letter == expected_thresh_letter) + +@pytest.mark.plotting def test_get_stat_file_base_columns(): # Independently test getting list # of the base MET version .stat file columns @@ -332,6 +311,8 @@ def test_get_stat_file_base_columns(): ) assert(test_stat_file_base_columns == expected_stat_file_base_columns) + +@pytest.mark.plotting def test_get_stat_file_line_type_columns(): # Independently test getting list # of the line type MET version .stat file columns @@ -441,6 +422,8 @@ def test_get_stat_file_line_type_columns(): assert(test_stat_file_line_type_columns == expected_stat_file_line_type_columns) + +@pytest.mark.plotting def get_clevels(): # Independently test creating an array # of levels centered about 0 to plot @@ -453,6 +436,8 @@ def get_clevels(): test_clevels = plot_util.get_clevels(data) assert(test_clevels == expected_clevels) + +@pytest.mark.plotting def test_calculate_average(): # Independently test getting the average # of a data array based on method @@ -558,7 +543,9 @@ def test_calculate_average(): assert(len(test_average_array) == len(expected_average_array)) for l in range(len(test_average_array)): assert(round(test_average_array[l],6) == expected_average_array[l]) - + + +@pytest.mark.long def test_calculate_ci(): pytest.skip("Takes far too long to run") # Independently test getting the @@ -691,6 +678,8 @@ def test_calculate_ci(): stat, average_method, randx) assert(test_intvl == expected_intvl) + +@pytest.mark.plotting def test_get_stat_plot_name(): # Independently test getting the # a more formalized statistic name @@ -730,6 +719,8 @@ def test_get_stat_plot_name(): test_stat_plot_name = plot_util.get_stat_plot_name(logger, stat) assert(test_stat_plot_name == expected_stat_plot_name) + +@pytest.mark.plotting def test_calculate_stat(): # Independently test calculating # statistic values diff --git a/internal_tests/pytests/tcmpr_plotter/test_tcmpr_plotter.py b/internal_tests/pytests/plotting/tcmpr_plotter/test_tcmpr_plotter.py similarity index 99% rename from internal_tests/pytests/tcmpr_plotter/test_tcmpr_plotter.py rename to internal_tests/pytests/plotting/tcmpr_plotter/test_tcmpr_plotter.py index e50c64ce29..519bcbb943 100644 --- a/internal_tests/pytests/tcmpr_plotter/test_tcmpr_plotter.py +++ b/internal_tests/pytests/plotting/tcmpr_plotter/test_tcmpr_plotter.py @@ -1,12 +1,8 @@ #!/usr/bin/env python3 -import os -import sys -import re import pytest -from datetime import datetime -import produtil +import os from metplus.wrappers.tcmpr_plotter_wrapper import TCMPRPlotterWrapper @@ -18,6 +14,7 @@ TIME_FMT = '%Y%m%d%H' RUN_TIME = '20141214' + def set_minimum_config_settings(config): # set config variables to prevent command from running and bypass check # if input files actually exist @@ -37,6 +34,7 @@ def set_minimum_config_settings(config): config.set('config', 'TCMPR_PLOTTER_PLOT_OUTPUT_DIR', '{OUTPUT_BASE}/TCMPRPlotter/tcmpr_plots') + @pytest.mark.parametrize( 'config_overrides,expected_loop_args', [ # 0: no loop args @@ -99,6 +97,7 @@ def set_minimum_config_settings(config): 'plot': [('pitem1', 'P Label 1'), ('pitem2', 'P Label 2')]}), ] ) +@pytest.mark.plotting def test_read_loop_info(metplus_config, config_overrides, expected_loop_args): config = metplus_config() @@ -111,6 +110,7 @@ def test_read_loop_info(metplus_config, config_overrides, expected_loop_args): wrapper = TCMPRPlotterWrapper(config) assert wrapper.read_loop_info() == expected_loop_args + @pytest.mark.parametrize( 'config_overrides,expected_strings', [ # 0: no optional arguments @@ -178,7 +178,7 @@ def test_read_loop_info(metplus_config, config_overrides, expected_loop_args): '-dep ditem1 -plot pitem1')]), ] ) - +@pytest.mark.plotting def test_tcmpr_plotter_loop(metplus_config, config_overrides, expected_strings): config = metplus_config() @@ -271,7 +271,7 @@ def test_tcmpr_plotter_loop(metplus_config, config_overrides, ({'TCMPR_PLOTTER_PLOT_TYPES': 'item1'}, '-plot item1'), ] ) - +@pytest.mark.plotting def test_tcmpr_plotter(metplus_config, config_overrides, expected_string): # add a space before value if expected string has a value if expected_string: diff --git a/internal_tests/pytests/produtil/README b/internal_tests/pytests/produtil/README deleted file mode 100644 index 540ba31e6d..0000000000 --- a/internal_tests/pytests/produtil/README +++ /dev/null @@ -1,23 +0,0 @@ -The test_produtil.py provides some simple tests for the produtil module. - -To run the test: - -1) cd to the directory METplus/internal_tests/pytest/produtil - -2) open the test_produtil.py file and replace the '/path/to' with the full path to the directory where your produtil_test.conf file -resides (this will be in METplus/internal_tests/pytest/produtil). - -NOTE: This is necessary, as we are NOT using run_metplus.py to begin the process of reading in the config -file, test_produtil.conf - - -2) Then, from the command line, enter the following command: - - pytest -c ./produtil_test.conf - -There are currently 9 tests and they should pass. - - - - - diff --git a/internal_tests/pytests/produtil/produtil_test.conf b/internal_tests/pytests/produtil/produtil_test.conf deleted file mode 100644 index 8d3b0b84b7..0000000000 --- a/internal_tests/pytests/produtil/produtil_test.conf +++ /dev/null @@ -1,31 +0,0 @@ - -# Test configuration for METplus produtil -[config] -STRING_VALUE = someStringValue!#@$% -INT_VALUE = 2908887 -RAW_VALUE = GRIB_lvl_type = 100 -BOOL_VALUE = True -NEW_LINES = very long line requiring newline character to be tested 12345 - 67890 end of the line. -UNASSIGNED_VALUE = -JOB_LIST = -job filter -dump_row {PROJ_DIR}/dump_file.out -job summary by AMAX_WIND -job summary 'ABS(AMAX_WIND-BMAX_WIND)' -out {OUTPUT_BASE}/max_wind_delta.tcst -JOBS = -job summary -by AMODEL,LEAD -column AMSLP -column BMSLP -column 'ABS(AMSLP-BMSLP)' -out {OUTPUT_BASE}/tc_stat_summary.out - -[dir] -# set in the metplus_data.conf to /path/to, override here for testing -PROJ_DIR = /tmp/produtil_testing - -# set in the metplus_system.conf to /path/to, override here for testing, set to -# appropriate version of MET -MET_INSTALL_DIR = /usr/local/met-8.1 -METPLUS_BASE = /usr/local/met-8.1 -OUTPUT_BASE = /tmp/produtil_testing/out -TMP_DIR = /tmp/produtil_testing/tmp - -# Used for testing -DIR_VALUE = /tmp/some_dir -BASE_DIR = /tmp -SPECIFIC_DIR = {BASE_DIR}/specific_place - -[exe] -WGRIB2 = wgrib2 diff --git a/internal_tests/pytests/produtil/test_produtil.py b/internal_tests/pytests/produtil/test_produtil.py deleted file mode 100644 index c5e816e742..0000000000 --- a/internal_tests/pytests/produtil/test_produtil.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import produtil.setup -import sys -import logging -import pytest -from shutil import which - -from metplus.util import met_util as util - -# -# These are tests (not necessarily unit tests) for the -# MET Point-Stat Wrapper, PointStatWrapper.py -# NOTE: This test requires pytest, which is NOT part of the standard Python -# library. -# These tests require one configuration file in addition to the three -# required METplus configuration files: point_stat_test.conf. This contains -# the information necessary for running all the tests. Each test can be -# customized to replace various settings if needed. -# - -# -# -----------Mandatory----------- -# configuration and fixture to support METplus configuration files beyond -# the metplus_data, metplus_system, and metplus_runtime conf files. -# - - -# Add a test configuration -def pytest_addoption(parser): - parser.addoption("-c", action="store", help=" -c ") - - -# @pytest.fixture -def cmdopt(request): - return request.config.getoption("-c") - - -# ------------------------ -def dummy(): - assert(True) - -def get_config_obj(metplus_config): - """! Create the configuration object that is used by all tests""" - file_list = ["/path/to/METplus/internal_tests/pytests/produtil"] - extra_configs = [] - extra_configs.append(os.path.join(os.path.dirname(__file__), 'produtil_test.conf')) - config = metplus_config(extra_configs) - - return config - - -def test_getstr_ok(metplus_config): - """! Test that the expected string is retrieved via produtil's getstr - method - """ - conf_obj = get_config_obj(metplus_config) - str_value = conf_obj.getstr('config', 'STRING_VALUE') - expected_str_value = "someStringValue!#@$%" - assert str_value == expected_str_value - - -def test_getint_ok(metplus_config): - """! Test that the expected int in the produtil_test.conf file has been - retrieved correctly. - """ - conf_obj = get_config_obj(metplus_config) - expected_int_value = int(2908887) - int_value = conf_obj.getint('config', 'INT_VALUE') - assert int_value == expected_int_value - - - -def test_getdir_ok(metplus_config): - """! Test that the directory in the produtil_test.conf file has been - correctly retrieved. - """ - conf_obj = get_config_obj(metplus_config) - expected_dir = "/tmp/some_dir" - dir_retrieved = conf_obj.getdir('DIR_VALUE') - assert dir_retrieved == expected_dir - - -def test_getdir_compound_ok(metplus_config): - """! Test that directories created from other directories, ie. - BASE_DIR = /base/dir - SPECIFIC_DIR = {BASE_DIR}/specific/dir - - correctly returns the directory path for SPECIFIC_DIR - """ - expected_specific_dir = "/tmp/specific_place" - conf_obj = get_config_obj(metplus_config) - specific_dir = conf_obj.getdir('SPECIFIC_DIR') - assert specific_dir == expected_specific_dir - - -def test_no_value_as_string(metplus_config): - """! Tests that a key with no value returns an empty string.""" - - conf_obj = get_config_obj(metplus_config) - expected_unassigned = '' - unassigned = conf_obj.getstr('config', 'UNASSIGNED_VALUE') - print("unassigned: ", unassigned) - print("expected: ", expected_unassigned) - assert unassigned == expected_unassigned - - -def test_no_value_as_list(metplus_config): - """! Tests that a key with no list of strings returns an empty list.""" - - conf_obj = get_config_obj(metplus_config) - expected_unassigned = [] - unassigned = util.getlist(conf_obj.getstr('config', 'UNASSIGNED_VALUE')) - assert unassigned == expected_unassigned - - -def test_new_lines_in_conf(metplus_config): - """! Test that any newlines in the configuration file are handled - properly - """ - - conf_obj = get_config_obj(metplus_config) - expected_string = \ - "very long line requiring newline character to be tested 12345\n67890 end of the line." - long_line = conf_obj.getstr('config', 'NEW_LINES') - assert long_line == expected_string - - -def test_get_exe_ok(metplus_config): - """! Test that executables are correctly retrieved.""" - conf_obj = get_config_obj(metplus_config) - expected_exe = which('wgrib2') - executable = conf_obj.getexe('WGRIB2') - assert executable == expected_exe - - -def test_get_bool(metplus_config): - """! Test that boolean values are correctly retrieved.""" - conf_obj = get_config_obj(metplus_config) - bool_val = conf_obj.getbool('config', 'BOOL_VALUE') - assert bool_val is True - diff --git a/internal_tests/pytests/produtil/work_in_progress_test_produtil_regression.py b/internal_tests/pytests/produtil/work_in_progress_test_produtil_regression.py deleted file mode 100644 index 580e376cc7..0000000000 --- a/internal_tests/pytests/produtil/work_in_progress_test_produtil_regression.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import produtil -import sys -import logging -import pytest -import config_metplus -import config_launcher as launcher -import met_util as util - - -# -# These are tests (not necessarily unit tests) for the -# MET Point-Stat Wrapper, PointStatWrapper.py -# NOTE: This test requires pytest, which is NOT part of the standard Python -# library. -# These tests require one configuration file in addition to the three -# required METplus configuration files: point_stat_test.conf. This contains -# the information necessary for running all the tests. Each test can be -# customized to replace various settings if needed. -# - -# -# -----------Mandatory----------- -# configuration and fixture to support METplus configuration files beyond -# the metplus_data, metplus_system, and metplus_runtime conf files. -# - - -# Add a test configuration -# def pytest_addoption(parser): -# parser.addoption("-c", action="store", help=" -c ") -# -# -# # @pytest.fixture -# def cmdopt(request): -# return request.config.getoption("-c") - - -# ------------------------ - -def dummy(): - assert(True) - - -def get_config_obj(): - """! Create the configuration object that is used by all tests""" - file_list = ["METplus/internal_tests/pytests/produtil"] - config_obj = config_metplus.setup(file_list[0]) - - return config_obj - - -def test_getstr_ok(regtest): - """! Test that the expected string is retrieved via produtil's getstr - method - """ - conf_obj = get_config_obj() - str_value = conf_obj.getstr('config', 'STRING_VALUE') - expected_str_value = "someStringValue!#@$%" - # print(str_value, file=regtest) - regtest.write("done") -# -# -# def test_getint_ok(regtest): -# """! Test that the expected int in the produtil_test.conf file has been -# retrieved correctly. -# """ -# conf_obj = get_config_obj() -# expected_int_value = int(2908887) -# int_value = conf_obj.getint('config', 'INT_VALUE') -# # print(int_value, file=regtest) -# regtest.write("done") -# -# -# def test_getraw_ok(regtest): -# """! Test that the raw value in the produtil_test.conf file has been -# retrieved correctly. -# """ -# conf_obj = get_config_obj() -# expected_raw = 'GRIB_lvl_type = 100' -# raw_value = conf_obj.getraw('config', 'RAW_VALUE') -# # print(raw_value, file=regtest) -# # regtest.write("done") -# -# -# def test_getdir_ok(regtest): -# """! Test that the directory in the produtil_test.conf file has been -# correctly retrieved. -# """ -# conf_obj = get_config_obj() -# expected_dir = "/tmp/some_dir" -# dir_retrieved = conf_obj.getdir('DIR_VALUE') -# # print(dir_retrieved, file=regtest) -# -# -# def test_getdir_compound_ok(regtest): -# """! Test that directories created from other directories, ie. -# BASE_DIR = /base/dir -# SPECIFIC_DIR = {BASE_DIR}/specific/dir -# -# correctly returns the directory path for SPECIFIC_DIR -# """ -# expected_specific_dir = "/tmp/specific_place" -# conf_obj = get_config_obj() -# specific_dir = conf_obj.getdir('SPECIFIC_DIR') -# print(specific_dir, file=regtest) -# -# -# def test_no_value_as_string(regtest): -# """! Tests that a key with no value returns an empty string.""" -# -# conf_obj = get_config_obj() -# expected_unassigned = '' -# unassigned = conf_obj.getstr('config', 'UNASSIGNED_VALUE') -# # print(unassigned, file=regtest) -# -# -# def test_no_value_as_list(regtest): -# """! Tests that a key with no list of strings returns an empty list.""" -# -# conf_obj = get_config_obj() -# expected_unassigned = [] -# unassigned = util.getlist(conf_obj.getstr('config', 'UNASSIGNED_VALUE')) -# assert unassigned == expected_unassigned -# # print(unassigned, file=regtest) -# -# -# def test_new_lines_in_conf(regtest): -# """! Test that any newlines in the configuration file are handled -# properly -# """ -# -# conf_obj = get_config_obj() -# expected_string = \ -# "very long line requiring newline character to be tested 12345\n67890 end of the line." -# long_line = conf_obj.getstr('config', 'NEW_LINES') -# assert long_line == expected_string -# # print(long_line, file=regtest) -# -# -# def test_get_exe_ok(regtest): -# """! Test that executables are correctly retrieved.""" -# conf_obj = get_config_obj() -# expected_exe = '/usr/local/bin/wgrib2' -# executable = conf_obj.getexe('WGRIB2') -# assert executable == expected_exe -# # print(executable, file=regtest) -# -# -# def test_get_bool(regtest): -# """! Test that boolean values are correctly retrieved.""" -# conf_obj = get_config_obj() -# bool_val = conf_obj.getbool('config', 'BOOL_VALUE') -# assert bool_val is True -# # print(bool_val, file=regtest) -# diff --git a/internal_tests/pytests/pytest.ini b/internal_tests/pytests/pytest.ini new file mode 100644 index 0000000000..8630509ec0 --- /dev/null +++ b/internal_tests/pytests/pytest.ini @@ -0,0 +1,9 @@ +[pytest] +markers = + util: custom marker for testing metplus/util logic + wrapper_a: custom marker for testing metplus/wrapper logic - A group + wrapper_b: custom marker for testing metplus/wrapper logic - B group + wrapper_c: custom marker for testing metplus/wrapper logic - C group + wrapper: custom marker for testing metplus/wrapper logic - all others + long: custom marker for tests that take a long time to run + plotting: custom marker for tests that involve plotting diff --git a/internal_tests/pytests/config/config_1.conf b/internal_tests/pytests/util/config/config_1.conf similarity index 100% rename from internal_tests/pytests/config/config_1.conf rename to internal_tests/pytests/util/config/config_1.conf diff --git a/internal_tests/pytests/config/config_2.conf b/internal_tests/pytests/util/config/config_2.conf similarity index 100% rename from internal_tests/pytests/config/config_2.conf rename to internal_tests/pytests/util/config/config_2.conf diff --git a/internal_tests/pytests/config/config_3.conf b/internal_tests/pytests/util/config/config_3.conf similarity index 100% rename from internal_tests/pytests/config/config_3.conf rename to internal_tests/pytests/util/config/config_3.conf diff --git a/internal_tests/pytests/config/test_config.py b/internal_tests/pytests/util/config/test_config.py similarity index 89% rename from internal_tests/pytests/config/test_config.py rename to internal_tests/pytests/util/config/test_config.py index a18678af32..7c054ab3d8 100644 --- a/internal_tests/pytests/config/test_config.py +++ b/internal_tests/pytests/util/config/test_config.py @@ -1,16 +1,14 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 -import sys import pytest -import datetime + import os from configparser import NoOptionError from shutil import which -import produtil - from metplus.util import met_util as util + @pytest.mark.parametrize( 'input_value, result', [ (3600, 3600), @@ -28,6 +26,7 @@ (None, None), ] ) +@pytest.mark.util def test_getseconds(metplus_config, input_value, result): conf = metplus_config() if input_value is not None: @@ -35,10 +34,11 @@ def test_getseconds(metplus_config, input_value, result): try: seconds = conf.getseconds('config', 'TEST_SECONDS') - assert(seconds == result) + assert seconds == result except NoOptionError: if result is None: - assert(True) + assert True + # value = None -- config variable not set @pytest.mark.parametrize( @@ -55,6 +55,7 @@ def test_getseconds(metplus_config, input_value, result): (None, '1', '1'), ] ) +@pytest.mark.util def test_getstr(metplus_config, input_value, default, result): conf = metplus_config() if input_value is not None: @@ -62,10 +63,11 @@ def test_getstr(metplus_config, input_value, default, result): # catch NoOptionError exception and pass test if default is None try: - assert(result == conf.getstr('config', 'TEST_GETSTR', default)) + assert result == conf.getstr('config', 'TEST_GETSTR', default) except NoOptionError: if default is None: - assert(True) + assert True + # value = None -- config variable not set @pytest.mark.parametrize( @@ -78,6 +80,7 @@ def test_getstr(metplus_config, input_value, default, result): ] ) +@pytest.mark.util def test_getdir(metplus_config, input_value, default, result): conf = metplus_config() if input_value is not None: @@ -85,13 +88,14 @@ def test_getdir(metplus_config, input_value, default, result): # catch NoOptionError exception and pass test if default is None try: - assert(result == conf.getdir('TEST_GETSTR', default=default)) + assert result == conf.getdir('TEST_GETSTR', default=default) except NoOptionError: if result is 'NoOptionError': - assert(True) + assert True except ValueError: if result is 'ValueError': - assert(True) + assert True + # value = None -- config variable not set @pytest.mark.parametrize( @@ -104,6 +108,7 @@ def test_getdir(metplus_config, input_value, default, result): ('{valid?fmt=%Y%m%d}_{NOT_REAL_VAR}', None, '{valid?fmt=%Y%m%d}_{NOT_REAL_VAR}'), ] ) +@pytest.mark.util def test_getraw(metplus_config, input_value, default, result): conf = metplus_config() conf.set('config', 'TEST_EXTRA', 'extra') @@ -112,7 +117,7 @@ def test_getraw(metplus_config, input_value, default, result): if input_value is not None: conf.set('config', 'TEST_GETRAW', input_value) - assert(result == conf.getraw('config', 'TEST_GETRAW', default=default)) + assert result == conf.getraw('config', 'TEST_GETRAW', default=default) # value = None -- config variable not set @@ -137,6 +142,7 @@ def test_getraw(metplus_config, input_value, default, result): (None, None, None), ] ) +@pytest.mark.util def test_getbool(metplus_config, input_value, default, result): conf = metplus_config() if input_value is not None: @@ -144,10 +150,11 @@ def test_getbool(metplus_config, input_value, default, result): # catch NoOptionError exception and pass test if default is None try: - assert(result == conf.getbool('config', 'TEST_GETBOOL', default)) + assert result == conf.getbool('config', 'TEST_GETBOOL', default) except NoOptionError: if result is None: - assert(True) + assert True + # value = None -- config variable not set @pytest.mark.parametrize( @@ -158,12 +165,13 @@ def test_getbool(metplus_config, input_value, default, result): ('sh', which('sh')), ] ) +@pytest.mark.util def test_getexe(metplus_config, input_value, result): conf = metplus_config() if input_value is not None: conf.set('config', 'TEST_GETEXE', input_value) - assert(result == conf.getexe('TEST_GETEXE')) + assert result == conf.getexe('TEST_GETEXE') # value = None -- config variable not set @pytest.mark.parametrize( @@ -186,10 +194,11 @@ def test_getfloat(metplus_config, input_value, default, result): conf.set('config', 'TEST_GETFLOAT', input_value) try: - assert(result == conf.getfloat('config', 'TEST_GETFLOAT', default)) + assert result == conf.getfloat('config', 'TEST_GETFLOAT', default) except ValueError: if result is None: - assert(True) + assert True + # value = None -- config variable not set @pytest.mark.parametrize( @@ -209,16 +218,18 @@ def test_getfloat(metplus_config, input_value, default, result): ('', 2.2, util.MISSING_DATA_VALUE), ] ) +@pytest.mark.util def test_getint(metplus_config, input_value, default, result): conf = metplus_config() if input_value is not None: conf.set('config', 'TEST_GETINT', input_value) try: - assert(result == conf.getint('config', 'TEST_GETINT', default)) + assert result == conf.getint('config', 'TEST_GETINT', default) except ValueError: if result is None: - assert(True) + assert True + @pytest.mark.parametrize( 'config_key, expected_result', [ @@ -229,6 +240,7 @@ def test_getint(metplus_config, input_value, default, result): ('VAR_TO_TEST_A', 'A3'), ] ) +@pytest.mark.util def test_move_all_to_config_section(metplus_config, config_key, expected_result): config_files = ['config_1.conf', 'config_2.conf', @@ -237,7 +249,8 @@ def test_move_all_to_config_section(metplus_config, config_key, expected_result) test_dir = os.path.dirname(__file__) config_files = [os.path.join(test_dir, item) for item in config_files] config = metplus_config(config_files) - assert(config.getstr('config', config_key) == expected_result) + assert config.getstr('config', config_key) == expected_result + @pytest.mark.parametrize( 'overrides, config_key, expected_result', [ @@ -266,10 +279,12 @@ def test_move_all_to_config_section(metplus_config, config_key, expected_result) 'CMD_LINE_1', '2'), ] ) +@pytest.mark.util def test_move_all_to_config_section_cmd_line(metplus_config, overrides, config_key, expected_result): config = metplus_config(overrides) - assert(config.getstr('config', config_key, '') == expected_result) + assert config.getstr('config', config_key, '') == expected_result + @pytest.mark.parametrize( 'config_name, expected_result', [ @@ -314,6 +329,7 @@ def test_move_all_to_config_section_cmd_line(metplus_config, overrides, ), ] ) +@pytest.mark.util def test_getraw_nested_curly_braces(metplus_config, config_name, expected_result): @@ -323,4 +339,4 @@ def test_getraw_nested_curly_braces(metplus_config, config_files = [os.path.join(test_dir, item) for item in config_files] config = metplus_config(config_files) sec, name = config_name.split('.', 1) - assert(config.getraw(sec, name) == expected_result) + assert config.getraw(sec, name) == expected_result diff --git a/internal_tests/pytests/config_metplus/test_config_metplus.py b/internal_tests/pytests/util/config_metplus/test_config_metplus.py similarity index 95% rename from internal_tests/pytests/config_metplus/test_config_metplus.py rename to internal_tests/pytests/util/config_metplus/test_config_metplus.py index f0e669443b..07a32655f5 100644 --- a/internal_tests/pytests/config_metplus/test_config_metplus.py +++ b/internal_tests/pytests/util/config_metplus/test_config_metplus.py @@ -1,14 +1,18 @@ #!/usr/bin/env python3 import pytest + import pprint import os from datetime import datetime from metplus.util import config_metplus + +@pytest.mark.util def test_get_default_config_list(): test_data_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir, os.pardir, os.pardir, 'data', @@ -37,6 +41,7 @@ def test_get_default_config_list(): assert actual_new == expected_new assert actual_both == expected_both + @pytest.mark.parametrize( 'regex,index,id,expected_result', [ # 0: No ID @@ -64,6 +69,7 @@ def test_get_default_config_list(): '2': ['NAME', 'MEMBERS', 'REQUIRED', 'MIN_REQ']}), ] ) +@pytest.mark.util def test_find_indices_in_config_section(metplus_config, regex, index, id, expected_result): config = metplus_config() @@ -83,7 +89,6 @@ def test_find_indices_in_config_section(metplus_config, regex, index, config.set('config', 'TC_PAIRS_CONSENSUS2_REQUIRED', 'True') config.set('config', 'TC_PAIRS_CONSENSUS2_MIN_REQ', '2') - indices = config_metplus.find_indices_in_config_section(regex, config, index_index=index, id_index=id) @@ -94,6 +99,7 @@ def test_find_indices_in_config_section(metplus_config, regex, index, assert indices == expected_result + @pytest.mark.parametrize( 'conf_items, met_tool, expected_result', [ ({'CUSTOM_LOOP_LIST': "one, two, three"}, '', ['one', 'two', 'three']), @@ -110,12 +116,14 @@ def test_find_indices_in_config_section(metplus_config, regex, index, 'POINT2GRID_CUSTOM_LOOP_LIST': "four, five",}, 'point2grid', ['four', 'five']), ] ) +@pytest.mark.util def test_get_custom_string_list(metplus_config, conf_items, met_tool, expected_result): config = metplus_config() for conf_key, conf_value in conf_items.items(): config.set('config', conf_key, conf_value) - assert(config_metplus.get_custom_string_list(config, met_tool) == expected_result) + assert config_metplus.get_custom_string_list(config, met_tool) == expected_result + @pytest.mark.parametrize( 'config_var_name, expected_indices, set_met_tool', [ @@ -133,6 +141,7 @@ def test_get_custom_string_list(metplus_config, conf_items, met_tool, expected_r ('BOTH_VAR12_FIELD_NAME', ['12'], False), ] ) +@pytest.mark.util def test_find_var_indices_fcst(metplus_config, config_var_name, expected_indices, @@ -145,9 +154,10 @@ def test_find_var_indices_fcst(metplus_config, data_types=data_types, met_tool=met_tool) - assert(len(var_name_indices) == len(expected_indices)) + assert len(var_name_indices) == len(expected_indices) for actual_index in var_name_indices: - assert(actual_index in expected_indices) + assert actual_index in expected_indices + @pytest.mark.parametrize( 'data_type, met_tool, expected_out', [ @@ -172,10 +182,12 @@ def test_find_var_indices_fcst(metplus_config, ] ) +@pytest.mark.util def test_get_field_search_prefixes(data_type, met_tool, expected_out): assert(config_metplus.get_field_search_prefixes(data_type, met_tool) == expected_out) + @pytest.mark.parametrize( 'item_list, extension, is_valid', [ (['FCST'], 'NAME', False), @@ -215,9 +227,11 @@ def test_get_field_search_prefixes(data_type, met_tool, expected_out): ] ) +@pytest.mark.util def test_is_var_item_valid(metplus_config, item_list, extension, is_valid): conf = metplus_config() - assert(config_metplus.is_var_item_valid(item_list, '1', extension, conf)[0] == is_valid) + assert config_metplus.is_var_item_valid(item_list, '1', extension, conf)[0] == is_valid + @pytest.mark.parametrize( 'item_list, configs_to_set, is_valid', [ @@ -256,12 +270,14 @@ def test_is_var_item_valid(metplus_config, item_list, extension, is_valid): ] ) +@pytest.mark.util def test_is_var_item_valid_levels(metplus_config, item_list, configs_to_set, is_valid): conf = metplus_config() for key, value in configs_to_set.items(): conf.set('config', key, value) - assert(config_metplus.is_var_item_valid(item_list, '1', 'LEVELS', conf)[0] == is_valid) + assert config_metplus.is_var_item_valid(item_list, '1', 'LEVELS', conf)[0] == is_valid + # search prefixes are valid prefixes to append to field info variables # config_overrides are a dict of config vars and their values @@ -300,6 +316,7 @@ def test_is_var_item_valid_levels(metplus_config, item_list, configs_to_set, is_ ] ) +@pytest.mark.util def test_get_field_config_variables(metplus_config, search_prefixes, config_overrides, @@ -317,7 +334,8 @@ def test_get_field_config_variables(metplus_config, index, search_prefixes) - assert(field_configs.get(field_info_type) == expected_value) + assert field_configs.get(field_info_type) == expected_value + @pytest.mark.parametrize( 'config_keys, field_key, expected_value', [ @@ -365,6 +383,7 @@ def test_get_field_config_variables(metplus_config, ([], 'output_names', None), ] ) +@pytest.mark.util def test_get_field_config_variables_synonyms(metplus_config, config_keys, field_key, @@ -379,7 +398,8 @@ def test_get_field_config_variables_synonyms(metplus_config, index, [prefix]) - assert(field_configs.get(field_key) == expected_value) + assert field_configs.get(field_key) == expected_value + # field info only defined in the FCST_* variables @pytest.mark.parametrize( @@ -389,6 +409,7 @@ def test_get_field_config_variables_synonyms(metplus_config, ('OBS', False), ] ) +@pytest.mark.util def test_parse_var_list_fcst_only(metplus_config, data_type, list_created): conf = metplus_config() conf.set('config', 'FCST_VAR1_NAME', "NAME1") @@ -398,7 +419,7 @@ def test_parse_var_list_fcst_only(metplus_config, data_type, list_created): # this should not occur because OBS variables are missing if config_metplus.validate_configuration_variables(conf, force_check=True)[1]: - assert(False) + assert False var_list = config_metplus.parse_var_list(conf, time_info=None, data_type=data_type) @@ -414,7 +435,8 @@ def test_parse_var_list_fcst_only(metplus_config, data_type, list_created): var_list[2]['fcst_level'] == "LEVELS21" and \ var_list[3]['fcst_level'] == "LEVELS22") else: - assert(not var_list) + assert not var_list + # field info only defined in the OBS_* variables @pytest.mark.parametrize( @@ -424,6 +446,7 @@ def test_parse_var_list_fcst_only(metplus_config, data_type, list_created): ('FCST', False), ] ) +@pytest.mark.util def test_parse_var_list_obs(metplus_config, data_type, list_created): conf = metplus_config() conf.set('config', 'OBS_VAR1_NAME', "NAME1") @@ -433,7 +456,7 @@ def test_parse_var_list_obs(metplus_config, data_type, list_created): # this should not occur because FCST variables are missing if config_metplus.validate_configuration_variables(conf, force_check=True)[1]: - assert(False) + assert False var_list = config_metplus.parse_var_list(conf, time_info=None, data_type=data_type) @@ -449,7 +472,7 @@ def test_parse_var_list_obs(metplus_config, data_type, list_created): var_list[2]['obs_level'] == "LEVELS21" and \ var_list[3]['obs_level'] == "LEVELS22") else: - assert(not var_list) + assert not var_list # field info only defined in the BOTH_* variables @@ -460,6 +483,7 @@ def test_parse_var_list_obs(metplus_config, data_type, list_created): ('OBS', 'obs'), ] ) +@pytest.mark.util def test_parse_var_list_both(metplus_config, data_type, list_created): conf = metplus_config() conf.set('config', 'BOTH_VAR1_NAME', "NAME1") @@ -469,7 +493,7 @@ def test_parse_var_list_both(metplus_config, data_type, list_created): # this should not occur because BOTH variables are used if not config_metplus.validate_configuration_variables(conf, force_check=True)[1]: - assert(False) + assert False var_list = config_metplus.parse_var_list(conf, time_info=None, data_type=data_type) print(f'var_list:{var_list}') @@ -482,9 +506,11 @@ def test_parse_var_list_both(metplus_config, data_type, list_created): not var_list[1][f'{list_to_check}_level'] == "LEVELS12" or \ not var_list[2][f'{list_to_check}_level'] == "LEVELS21" or \ not var_list[3][f'{list_to_check}_level'] == "LEVELS22": - assert(False) + assert False + # field info defined in both FCST_* and OBS_* variables +@pytest.mark.util def test_parse_var_list_fcst_and_obs(metplus_config): conf = metplus_config() conf.set('config', 'FCST_VAR1_NAME', "FNAME1") @@ -498,7 +524,7 @@ def test_parse_var_list_fcst_and_obs(metplus_config): # this should not occur because FCST and OBS variables are found if not config_metplus.validate_configuration_variables(conf, force_check=True)[1]: - assert(False) + assert False var_list = config_metplus.parse_var_list(conf) @@ -519,7 +545,9 @@ def test_parse_var_list_fcst_and_obs(metplus_config): var_list[3]['fcst_level'] == "FLEVELS22" and \ var_list[3]['obs_level'] == "OLEVELS22") + # VAR1 defined by FCST, VAR2 defined by OBS +@pytest.mark.util def test_parse_var_list_fcst_and_obs_alternate(metplus_config): conf = metplus_config() conf.set('config', 'FCST_VAR1_NAME', "FNAME1") @@ -530,6 +558,7 @@ def test_parse_var_list_fcst_and_obs_alternate(metplus_config): # configuration is invalid and parse var list should not give any results assert(not config_metplus.validate_configuration_variables(conf, force_check=True)[1] and not config_metplus.parse_var_list(conf)) + # VAR1 defined by OBS, VAR2 by FCST, VAR3 by both FCST AND OBS @pytest.mark.parametrize( 'data_type, list_len, name_levels', [ @@ -538,6 +567,7 @@ def test_parse_var_list_fcst_and_obs_alternate(metplus_config): ('OBS', 4, ('ONAME1:OLEVELS11','ONAME1:OLEVELS12','ONAME3:OLEVELS31','ONAME3:OLEVELS32')), ] ) +@pytest.mark.util def test_parse_var_list_fcst_and_obs_and_both(metplus_config, data_type, list_len, name_levels): conf = metplus_config() conf.set('config', 'OBS_VAR1_NAME', "ONAME1") @@ -551,15 +581,15 @@ def test_parse_var_list_fcst_and_obs_and_both(metplus_config, data_type, list_le # configuration is invalid and parse var list should not give any results if config_metplus.validate_configuration_variables(conf, force_check=True)[1]: - assert(False) + assert False var_list = config_metplus.parse_var_list(conf, time_info=None, data_type=data_type) if len(var_list) != list_len: - assert(False) + assert False if data_type is None: - assert(len(var_list) == 0) + assert len(var_list) == 0 if name_levels is not None: dt_lower = data_type.lower() @@ -571,12 +601,13 @@ def test_parse_var_list_fcst_and_obs_and_both(metplus_config, data_type, list_le for expect, reality in zip(expected,var_list): if expect[f'{dt_lower}_name'] != reality[f'{dt_lower}_name']: - assert(False) + assert False if expect[f'{dt_lower}_level'] != reality[f'{dt_lower}_level']: - assert(False) + assert False + + assert True - assert(True) # option defined in obs only @pytest.mark.parametrize( @@ -586,6 +617,7 @@ def test_parse_var_list_fcst_and_obs_and_both(metplus_config, data_type, list_le ('OBS', 0), ] ) +@pytest.mark.util def test_parse_var_list_fcst_only_options(metplus_config, data_type, list_len): conf = metplus_config() conf.set('config', 'FCST_VAR1_NAME', "NAME1") @@ -595,11 +627,12 @@ def test_parse_var_list_fcst_only_options(metplus_config, data_type, list_len): # this should not occur because OBS variables are missing if config_metplus.validate_configuration_variables(conf, force_check=True)[1]: - assert(False) + assert False var_list = config_metplus.parse_var_list(conf, time_info=None, data_type=data_type) - assert(len(var_list) == list_len) + assert len(var_list) == list_len + @pytest.mark.parametrize( 'met_tool, indices', [ @@ -608,6 +641,7 @@ def test_parse_var_list_fcst_only_options(metplus_config, data_type, list_len): ('ENSEMBLE_STAT', {}), ] ) +@pytest.mark.util def test_find_var_indices_wrapper_specific(metplus_config, met_tool, indices): conf = metplus_config() data_type = 'FCST' @@ -617,11 +651,13 @@ def test_find_var_indices_wrapper_specific(metplus_config, met_tool, indices): var_name_indices = config_metplus.find_var_name_indices(conf, data_types=[data_type], met_tool=met_tool) - assert(var_name_indices == indices) + assert var_name_indices == indices + # ensure that the field configuration used for # met_tool_wrapper/EnsembleStat/EnsembleStat.conf # works as expected +@pytest.mark.util def test_parse_var_list_ensemble(metplus_config): config = metplus_config() config.set('config', 'ENS_VAR1_NAME', 'APCP') @@ -704,13 +740,15 @@ def test_parse_var_list_ensemble(metplus_config): assert(len(ensemble_var_list) == len(expected_ens_list)) for actual_ens, expected_ens in zip(ensemble_var_list, expected_ens_list): for key, value in expected_ens.items(): - assert(actual_ens.get(key) == value) + assert actual_ens.get(key) == value assert(len(var_list) == len(expected_var_list)) for actual_var, expected_var in zip(var_list, expected_var_list): for key, value in expected_var.items(): - assert(actual_var.get(key) == value) + assert actual_var.get(key) == value + +@pytest.mark.util def test_parse_var_list_series_by(metplus_config): config = metplus_config() config.set('config', 'BOTH_EXTRACT_TILES_VAR1_NAME', 'RH') @@ -768,16 +806,18 @@ def test_parse_var_list_series_by(metplus_config): print(f'SeriesAnalysis var list:') pp.pprint(actual_sa_list) - assert(len(actual_et_list) == len(expected_et_list)) + assert len(actual_et_list) == len(expected_et_list) for actual_et, expected_et in zip(actual_et_list, expected_et_list): for key, value in expected_et.items(): - assert(actual_et.get(key) == value) + assert actual_et.get(key) == value assert(len(actual_sa_list) == len(expected_sa_list)) for actual_sa, expected_sa in zip(actual_sa_list, expected_sa_list): for key, value in expected_sa.items(): - assert(actual_sa.get(key) == value) + assert actual_sa.get(key) == value + +@pytest.mark.util def test_parse_var_list_priority_fcst(metplus_config): priority_list = ['FCST_GRID_STAT_VAR1_NAME', 'FCST_GRID_STAT_VAR1_INPUT_FIELD_NAME', @@ -806,13 +846,15 @@ def test_parse_var_list_priority_fcst(metplus_config): data_type='FCST', met_tool='grid_stat') - assert(len(var_list) == 1) - assert(var_list[0].get('fcst_name') == priority_list[0].lower()) + assert len(var_list) == 1 + assert var_list[0].get('fcst_name') == priority_list[0].lower() priority_list.pop(0) + # test that if wrapper specific field info is specified, it only gets # values from that list. All generic values should be read if no # wrapper specific field info variables are specified +@pytest.mark.util def test_parse_var_list_wrapper_specific(metplus_config): conf = metplus_config() conf.set('config', 'FCST_VAR1_NAME', "ENAME1") @@ -846,6 +888,7 @@ def test_parse_var_list_wrapper_specific(metplus_config): g_var_list[0]['fcst_level'] == "GLEVELS11" and g_var_list[1]['fcst_level'] == "GLEVELS12") + @pytest.mark.parametrize( 'config_overrides, expected_results', [ # 2 levels @@ -896,6 +939,7 @@ def test_parse_var_list_wrapper_specific(metplus_config): ]), ] ) +@pytest.mark.util def test_parse_var_list_py_embed_multi_levels(metplus_config, config_overrides, expected_results): config = metplus_config() @@ -906,19 +950,19 @@ def test_parse_var_list_py_embed_multi_levels(metplus_config, config_overrides, var_list = config_metplus.parse_var_list(config, time_info=time_info, data_type=None) - assert(len(var_list) == len(expected_results)) + assert len(var_list) == len(expected_results) for var_item, expected_result in zip(var_list, expected_results): - assert(var_item['fcst_name'] == expected_result) + assert var_item['fcst_name'] == expected_result # run again with data type specified var_list = config_metplus.parse_var_list(config, time_info=time_info, data_type='FCST') - assert(len(var_list) == len(expected_results)) + assert len(var_list) == len(expected_results) for var_item, expected_result in zip(var_list, expected_results): - assert(var_item['fcst_name'] == expected_result) + assert var_item['fcst_name'] == expected_result @pytest.mark.parametrize( @@ -955,12 +999,14 @@ def test_parse_var_list_py_embed_multi_levels(metplus_config, config_overrides, ('StatAnalysis, MakePlots', ['StatAnalysis']), ] ) +@pytest.mark.util def test_get_process_list(metplus_config, input_list, expected_list): conf = metplus_config() conf.set('config', 'PROCESS_LIST', input_list) process_list = config_metplus.get_process_list(conf) output_list = [item[0] for item in process_list] - assert(output_list == expected_list) + assert output_list == expected_list + @pytest.mark.parametrize( 'input_list, expected_list', [ @@ -987,12 +1033,15 @@ def test_get_process_list(metplus_config, input_list, expected_list): ('TCStat', 'two')]), ] ) +@pytest.mark.util def test_get_process_list_instances(metplus_config, input_list, expected_list): conf = metplus_config() conf.set('config', 'PROCESS_LIST', input_list) output_list = config_metplus.get_process_list(conf) - assert(output_list == expected_list) + assert output_list == expected_list + +@pytest.mark.util def test_getraw_sub_and_nosub(metplus_config): raw_string = '{MODEL}_{CURRENT_FCST_NAME}' sub_actual = 'FCST_NAME' @@ -1007,6 +1056,8 @@ def test_getraw_sub_and_nosub(metplus_config): sub_value = config.getraw('config', 'OUTPUT_PREFIX', sub_vars=True) assert sub_value == sub_actual + +@pytest.mark.util def test_getraw_instance_with_unset_var(metplus_config): """! Replicates bug where CURRENT_FCST_NAME is substituted with an empty string when copied from an instance section diff --git a/internal_tests/pytests/logging/test_logging.py b/internal_tests/pytests/util/logging/test_logging.py similarity index 79% rename from internal_tests/pytests/logging/test_logging.py rename to internal_tests/pytests/util/logging/test_logging.py index 7e31851c3a..68eca3262d 100644 --- a/internal_tests/pytests/logging/test_logging.py +++ b/internal_tests/pytests/util/logging/test_logging.py @@ -1,26 +1,13 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +import pytest import logging import re import os -import pytest - -# -# -----------Mandatory----------- -# configuration and fixture to support METplus configuration files beyond -# the metplus_data, metplus_system, and metplus_runtime conf files. -# - - -# Add a test configuration -def pytest_addoption(parser): - parser.addoption("-c", action="store", help=" -c ") - -# @pytest.fixture -def cmdopt(request): - return request.config.getoption("-c") +@pytest.mark.util def test_log_level(metplus_config): # Verify that the log level is set to what we indicated in the config file. config = metplus_config() @@ -30,6 +17,7 @@ def test_log_level(metplus_config): assert fixture_logger.isEnabledFor(level) +@pytest.mark.util def test_log_level_key(metplus_config): # Verify that the LOG_LEVEL key is in the config file config_instance = metplus_config() @@ -38,6 +26,7 @@ def test_log_level_key(metplus_config): assert config_instance.has_option(section, option) +@pytest.mark.util def test_logdir_exists(metplus_config): # Verify that the expected log dir exists. config = metplus_config() @@ -47,6 +36,7 @@ def test_logdir_exists(metplus_config): assert os.path.exists(log_dir) +@pytest.mark.util def test_logfile_exists(metplus_config): # Verify that a logfile with format metplus.log exists # We are assuming that there can be numerous files in the log directory. @@ -67,9 +57,3 @@ def test_logfile_exists(metplus_config): else: # There is no log directory assert False - - - - - - diff --git a/internal_tests/pytests/met_config/test_met_config.py b/internal_tests/pytests/util/met_config/test_met_config.py similarity index 96% rename from internal_tests/pytests/met_config/test_met_config.py rename to internal_tests/pytests/util/met_config/test_met_config.py index 0f990e678b..0f3adb6587 100644 --- a/internal_tests/pytests/met_config/test_met_config.py +++ b/internal_tests/pytests/util/met_config/test_met_config.py @@ -6,6 +6,7 @@ from metplus.util.met_config import _read_climo_file_name, _read_climo_field from metplus.util import CLIMO_TYPES + @pytest.mark.parametrize( 'config_overrides, expected_value', [ # 0 no relevant config set @@ -30,6 +31,7 @@ '{ name="TMP"; level="(*,*)"; }'), ] ) +@pytest.mark.util def test_read_climo_field(metplus_config, config_overrides, expected_value): app_name = 'app' for climo_type in ('MEAN', 'STDEV'): @@ -45,6 +47,7 @@ def test_read_climo_field(metplus_config, config_overrides, expected_value): _read_climo_field(climo_type, config, app_name) assert config.getraw('config', expected_var) == expected_value + @pytest.mark.parametrize( 'config_overrides, expected_value', [ # 0 no relevant config set @@ -127,6 +130,7 @@ def test_read_climo_field(metplus_config, config_overrides, expected_value): 'hour_interval = 12;}')), ] ) +@pytest.mark.util def test_handle_climo_dict(metplus_config, config_overrides, expected_value): app_name = 'app' for climo_type in ('MEAN', 'STDEV'): @@ -145,27 +149,30 @@ def test_handle_climo_dict(metplus_config, config_overrides, expected_value): expected_sub = expected_value.replace('', climo_type.lower()) assert output_dict[expected_var] == expected_sub + @pytest.mark.parametrize( 'name, data_type, mp_configs, extra_args', [ ('beg', 'int', 'BEG', None), ('end', 'int', ['END'], None), ] ) +@pytest.mark.util def test_met_config_info(name, data_type, mp_configs, extra_args): item = METConfig(name=name, data_type=data_type) item.metplus_configs = mp_configs item.extra_args = extra_args - assert(item.name == name) - assert(item.data_type == data_type) + assert item.name == name + assert item.data_type == data_type if isinstance(mp_configs, list): - assert(item.metplus_configs == mp_configs) + assert item.metplus_configs == mp_configs else: - assert(item.metplus_configs == [mp_configs]) + assert item.metplus_configs == [mp_configs] if not extra_args: - assert(item.extra_args == {}) + assert item.extra_args == {} + @pytest.mark.parametrize( 'data_type, expected_function', [ @@ -178,11 +185,12 @@ def test_met_config_info(name, data_type, mp_configs, extra_args): ('bad_name', None), ] ) +@pytest.mark.util def test_set_met_config_function(data_type, expected_function): try: function_found = set_met_config_function(data_type) function_name = function_found.__name__ if function_found else None - assert(function_name == expected_function) + assert function_name == expected_function except ValueError: assert expected_function is None @@ -196,9 +204,11 @@ def test_set_met_config_function(data_type, expected_function): ('G002', '"G002"'), ] ) +@pytest.mark.util def test_format_regrid_to_grid(input, output): assert format_regrid_to_grid(input) == output + @pytest.mark.parametrize( 'config_overrides, expected_value', [ # 0 no climo variables set @@ -232,6 +242,7 @@ def test_format_regrid_to_grid(input, output): 'PYTHON_XARRAY'), ] ) +@pytest.mark.util def test_read_climo_file_name(metplus_config, config_overrides, expected_value): # name of app used for testing to read/set config variables diff --git a/internal_tests/pytests/met_util/test_met_util.py b/internal_tests/pytests/util/met_util/test_met_util.py similarity index 91% rename from internal_tests/pytests/met_util/test_met_util.py rename to internal_tests/pytests/util/met_util/test_met_util.py index ccc7d6bcd9..8241ea4528 100644 --- a/internal_tests/pytests/met_util/test_met_util.py +++ b/internal_tests/pytests/util/met_util/test_met_util.py @@ -1,16 +1,17 @@ #!/usr/bin/env python3 -import sys +import pytest + import datetime import os from dateutil.relativedelta import relativedelta import pprint -import pytest from metplus.util import met_util as util from metplus.util import time_util from metplus.util.config_metplus import parse_var_list + @pytest.mark.parametrize( 'key, value', [ ({"gt2.3", "gt5.5"}, True), @@ -43,14 +44,15 @@ ([">SFP70", ">SFP80", ">SFP90", ">SFP95"], True), ] ) +@pytest.mark.util def test_threshold(key, value): - assert(util.validate_thresholds(key) == value) + assert util.validate_thresholds(key) == value + # parses a threshold and returns a list of tuples of # comparison and number, i.e.: # 'gt4' => [('gt', 4)] # gt4&<5 => [('gt', 4), ('lt', 5)] - @pytest.mark.parametrize( 'key, value', [ ('gt4', [('gt', 4)]), @@ -81,8 +83,10 @@ def test_threshold(key, value): ("1', 'gt1'), @@ -223,13 +171,16 @@ def test_set_lists_as_loop_or_group(metplus_config): 'lt805,lt1609,lt4828,lt8045,ge8045,lt16090'), ] ) +@pytest.mark.plotting def test_format_thresh(metplus_config, expression, expected_result): - # Idependently test the creation of + # Independently test the creation of # string values for defining thresholds st = stat_analysis_wrapper(metplus_config) - assert(st.format_thresh(expression) == expected_result) + assert st.format_thresh(expression) == expected_result + +@pytest.mark.plotting def test_build_stringsub_dict(metplus_config): # Independently test the building of # the dictionary used in the stringtemplate @@ -431,7 +382,9 @@ def test_build_stringsub_dict(metplus_config): datetime.datetime(1900, 1, 1, 0, 0, 0)) assert(test_stringsub_dict['obs_init_hour_end'] == datetime.datetime(1900, 1, 1, 23, 59 ,59)) - + + +@pytest.mark.plotting def test_get_output_filename(metplus_config): # Independently test the building of # the output file name @@ -488,7 +441,7 @@ def test_get_output_filename(metplus_config): lists_to_loop, lists_to_group, config_dict) - assert(expected_output_filename == test_output_filename) + assert expected_output_filename == test_output_filename # Test 2 expected_output_filename = ( 'MODEL_TEST_MODEL_TEST_ANL_' @@ -508,7 +461,7 @@ def test_get_output_filename(metplus_config): lists_to_loop, lists_to_group, config_dict) - assert(expected_output_filename == test_output_filename) + assert expected_output_filename == test_output_filename # Test 3 expected_output_filename = ( 'MODEL_TEST_MODEL_TEST_ANL' @@ -528,7 +481,7 @@ def test_get_output_filename(metplus_config): lists_to_loop, lists_to_group, config_dict) - assert(expected_output_filename == test_output_filename) + assert expected_output_filename == test_output_filename # Test 4 expected_output_filename = ( 'MODEL_TEST_MODEL_TEST_ANL' @@ -546,8 +499,10 @@ def test_get_output_filename(metplus_config): lists_to_loop, lists_to_group, config_dict) - assert(expected_output_filename == test_output_filename) + assert expected_output_filename == test_output_filename + +@pytest.mark.plotting def test_get_lookin_dir(metplus_config): # Independently test the building of # the lookin directory @@ -593,36 +548,44 @@ def test_get_lookin_dir(metplus_config): 'OBS_THRESH_LIST', 'COV_THRESH_LIST', 'ALPHA_LIST', 'LINE_TYPE_LIST' ] lists_to_loop = [ 'FCST_VALID_HOUR_LIST', 'MODEL_LIST' ] - stat_analysis_pytest_dir = os.path.dirname(__file__) + pytest_data_dir = os.path.join(os.path.dirname(__file__), os.pardir, + os.pardir, os.pardir, 'data') # Test 1 - expected_lookin_dir = os.path.join(stat_analysis_pytest_dir, - '../../data/fake/20180201') - dir_path = os.path.join(stat_analysis_pytest_dir, - '../../data/fake/*') + expected_lookin_dir = os.path.join(pytest_data_dir, 'fake/20180201') + dir_path = os.path.join(pytest_data_dir, 'fake/*') test_lookin_dir = st.get_lookin_dir(dir_path, lists_to_loop, lists_to_group, config_dict) - assert(expected_lookin_dir == test_lookin_dir) + assert expected_lookin_dir == test_lookin_dir # Test 2 - expected_lookin_dir = os.path.join(stat_analysis_pytest_dir, - '../../data/fake/20180201') - dir_path = os.path.join(stat_analysis_pytest_dir, - '../../data/fake/{valid?fmt=%Y%m%d}') + expected_lookin_dir = os.path.join(pytest_data_dir, 'fake/20180201') + dir_path = os.path.join(pytest_data_dir, 'fake/{valid?fmt=%Y%m%d}') test_lookin_dir = st.get_lookin_dir(dir_path, lists_to_loop, lists_to_group, config_dict) - assert(expected_lookin_dir == test_lookin_dir) + assert expected_lookin_dir == test_lookin_dir # Test 3 - no matches for lookin dir wildcard expected_lookin_dir = '' - dir_path = os.path.join(stat_analysis_pytest_dir, - '../../data/fake/*nothingmatches*') + dir_path = os.path.join(pytest_data_dir, 'fake/*nothingmatches*') test_lookin_dir = st.get_lookin_dir(dir_path, lists_to_loop, lists_to_group, config_dict) - assert(expected_lookin_dir == test_lookin_dir) + assert expected_lookin_dir == test_lookin_dir + # Test 4 - 2 paths, one with wildcard + expected_lookin_dir = os.path.join(pytest_data_dir, 'fake/20180201') + expected_lookin_dir = f'{expected_lookin_dir} {expected_lookin_dir}' + dir_path = os.path.join(pytest_data_dir, 'fake/*') + dir_path = f'{dir_path}, {dir_path}' + + test_lookin_dir = st.get_lookin_dir(dir_path, lists_to_loop, + lists_to_group, config_dict) + assert expected_lookin_dir == test_lookin_dir + + +@pytest.mark.plotting def test_format_valid_init(metplus_config): # Independently test the formatting # of the valid and initialization date and hours @@ -641,18 +604,18 @@ def test_format_valid_init(metplus_config): config_dict['OBS_VALID_HOUR'] = '' config_dict['OBS_INIT_HOUR'] = '' config_dict = st.format_valid_init(config_dict) - assert(config_dict['FCST_VALID_BEG'] == '20190101_000000') - assert(config_dict['FCST_VALID_END'] == '20190105_000000') - assert(config_dict['FCST_VALID_HOUR'] == '"000000"') - assert(config_dict['FCST_INIT_BEG'] == '') - assert(config_dict['FCST_INIT_END'] == '') - assert(config_dict['FCST_INIT_HOUR'] == '"000000", "120000"') - assert(config_dict['OBS_VALID_BEG'] == '') - assert(config_dict['OBS_VALID_END'] == '') - assert(config_dict['OBS_VALID_HOUR'] == '') - assert(config_dict['OBS_INIT_BEG'] == '') - assert(config_dict['OBS_INIT_END'] == '') - assert(config_dict['OBS_INIT_HOUR'] == '') + assert config_dict['FCST_VALID_BEG'] == '20190101_000000' + assert config_dict['FCST_VALID_END'] == '20190105_000000' + assert config_dict['FCST_VALID_HOUR'] == '"000000"' + assert config_dict['FCST_INIT_BEG'] == '' + assert config_dict['FCST_INIT_END'] == '' + assert config_dict['FCST_INIT_HOUR'] == '"000000", "120000"' + assert config_dict['OBS_VALID_BEG'] == '' + assert config_dict['OBS_VALID_END'] == '' + assert config_dict['OBS_VALID_HOUR'] == '' + assert config_dict['OBS_INIT_BEG'] == '' + assert config_dict['OBS_INIT_END'] == '' + assert config_dict['OBS_INIT_HOUR'] == '' # Test 2 st.c_dict['DATE_BEG'] = '20190101' st.c_dict['DATE_END'] = '20190105' @@ -664,18 +627,18 @@ def test_format_valid_init(metplus_config): config_dict['OBS_VALID_HOUR'] = '' config_dict['OBS_INIT_HOUR'] = '' config_dict = st.format_valid_init(config_dict) - assert(config_dict['FCST_VALID_BEG'] == '20190101_000000') - assert(config_dict['FCST_VALID_END'] == '20190105_120000') - assert(config_dict['FCST_VALID_HOUR'] == '"000000", "120000"') - assert(config_dict['FCST_INIT_BEG'] == '') - assert(config_dict['FCST_INIT_END'] == '') - assert(config_dict['FCST_INIT_HOUR'] == '"000000", "120000"') - assert(config_dict['OBS_VALID_BEG'] == '') - assert(config_dict['OBS_VALID_END'] == '') - assert(config_dict['OBS_VALID_HOUR'] == '') - assert(config_dict['OBS_INIT_BEG'] == '') - assert(config_dict['OBS_INIT_END'] == '') - assert(config_dict['OBS_INIT_HOUR'] == '') + assert config_dict['FCST_VALID_BEG'] == '20190101_000000' + assert config_dict['FCST_VALID_END'] == '20190105_120000' + assert config_dict['FCST_VALID_HOUR'] == '"000000", "120000"' + assert config_dict['FCST_INIT_BEG'] == '' + assert config_dict['FCST_INIT_END'] == '' + assert config_dict['FCST_INIT_HOUR'] == '"000000", "120000"' + assert config_dict['OBS_VALID_BEG'] == '' + assert config_dict['OBS_VALID_END'] == '' + assert config_dict['OBS_VALID_HOUR'] == '' + assert config_dict['OBS_INIT_BEG'] == '' + assert config_dict['OBS_INIT_END'] == '' + assert config_dict['OBS_INIT_HOUR'] == '' # Test 3 st.c_dict['DATE_BEG'] = '20190101' st.c_dict['DATE_END'] = '20190101' @@ -687,18 +650,18 @@ def test_format_valid_init(metplus_config): config_dict['OBS_VALID_HOUR'] = '000000' config_dict['OBS_INIT_HOUR'] = '"000000", "120000"' config_dict = st.format_valid_init(config_dict) - assert(config_dict['FCST_VALID_BEG'] == '') - assert(config_dict['FCST_VALID_END'] == '') - assert(config_dict['FCST_VALID_HOUR'] == '') - assert(config_dict['FCST_INIT_BEG'] == '') - assert(config_dict['FCST_INIT_END'] == '') - assert(config_dict['FCST_INIT_HOUR'] == '') - assert(config_dict['OBS_VALID_BEG'] == '20190101_000000') - assert(config_dict['OBS_VALID_END'] == '20190101_000000') - assert(config_dict['OBS_VALID_HOUR'] == '"000000"') - assert(config_dict['OBS_INIT_BEG'] == '') - assert(config_dict['OBS_INIT_END'] == '') - assert(config_dict['OBS_INIT_HOUR'] == '"000000", "120000"') + assert config_dict['FCST_VALID_BEG'] == '' + assert config_dict['FCST_VALID_END'] == '' + assert config_dict['FCST_VALID_HOUR'] == '' + assert config_dict['FCST_INIT_BEG'] == '' + assert config_dict['FCST_INIT_END'] == '' + assert config_dict['FCST_INIT_HOUR'] == '' + assert config_dict['OBS_VALID_BEG'] == '20190101_000000' + assert config_dict['OBS_VALID_END'] == '20190101_000000' + assert config_dict['OBS_VALID_HOUR'] == '"000000"' + assert config_dict['OBS_INIT_BEG'] == '' + assert config_dict['OBS_INIT_END'] == '' + assert config_dict['OBS_INIT_HOUR'] == '"000000", "120000"' # Test 3 st.c_dict['DATE_BEG'] = '20190101' st.c_dict['DATE_END'] = '20190101' @@ -710,19 +673,21 @@ def test_format_valid_init(metplus_config): config_dict['OBS_VALID_HOUR'] = '000000' config_dict['OBS_INIT_HOUR'] = '"000000", "120000"' config_dict = st.format_valid_init(config_dict) - assert(config_dict['FCST_VALID_BEG'] == '') - assert(config_dict['FCST_VALID_END'] == '') - assert(config_dict['FCST_VALID_HOUR'] == '') - assert(config_dict['FCST_INIT_BEG'] == '') - assert(config_dict['FCST_INIT_END'] == '') - assert(config_dict['FCST_INIT_HOUR'] == '') - assert(config_dict['OBS_VALID_BEG'] == '') - assert(config_dict['OBS_VALID_END'] == '') - assert(config_dict['OBS_VALID_HOUR'] == '"000000"') - assert(config_dict['OBS_INIT_BEG'] == '20190101_000000') - assert(config_dict['OBS_INIT_END'] == '20190101_120000') - assert(config_dict['OBS_INIT_HOUR'] == '"000000", "120000"') - + assert config_dict['FCST_VALID_BEG'] == '' + assert config_dict['FCST_VALID_END'] == '' + assert config_dict['FCST_VALID_HOUR'] == '' + assert config_dict['FCST_INIT_BEG'] == '' + assert config_dict['FCST_INIT_END'] == '' + assert config_dict['FCST_INIT_HOUR'] == '' + assert config_dict['OBS_VALID_BEG'] == '' + assert config_dict['OBS_VALID_END'] == '' + assert config_dict['OBS_VALID_HOUR'] == '"000000"' + assert config_dict['OBS_INIT_BEG'] == '20190101_000000' + assert config_dict['OBS_INIT_END'] == '20190101_120000' + assert config_dict['OBS_INIT_HOUR'] == '"000000", "120000"' + + +@pytest.mark.plotting def test_parse_model_info(metplus_config): # Independently test the creation of # the model information dictionary @@ -747,19 +712,16 @@ def test_parse_model_info(metplus_config): expected_out_stat_filename_type = 'user' test_model_info_list = st.parse_model_info() - assert(test_model_info_list[0]['name'] == expected_name) - assert(test_model_info_list[0]['reference_name'] == - expected_reference_name) - assert(test_model_info_list[0]['obtype'] == expected_obtype) - assert(test_model_info_list[0]['dump_row_filename_template'] == - expected_dump_row_filename_template) - assert(test_model_info_list[0]['dump_row_filename_type'] == - expected_dump_row_filename_type) - assert(test_model_info_list[0]['out_stat_filename_template'] == - expected_out_stat_filename_template) - assert(test_model_info_list[0]['out_stat_filename_type'] == - expected_out_stat_filename_type) + assert test_model_info_list[0]['name'] == expected_name + assert test_model_info_list[0]['reference_name'] == expected_reference_name + assert test_model_info_list[0]['obtype'] == expected_obtype + assert test_model_info_list[0]['dump_row_filename_template'] == expected_dump_row_filename_template + assert test_model_info_list[0]['dump_row_filename_type'] == expected_dump_row_filename_type + assert test_model_info_list[0]['out_stat_filename_template'] == expected_out_stat_filename_template + assert test_model_info_list[0]['out_stat_filename_type'] == expected_out_stat_filename_type + +@pytest.mark.plotting def test_run_stat_analysis(metplus_config): # Test running of stat_analysis st = stat_analysis_wrapper(metplus_config) @@ -772,9 +734,9 @@ def test_run_stat_analysis(metplus_config): st.c_dict['DATE_END'] = '20190101' st.c_dict['DATE_TYPE'] = 'VALID' st.run_stat_analysis() - assert(os.path.exists(expected_filename)) - assert(os.path.getsize(expected_filename) - == os.path.getsize(comparison_filename)) + assert os.path.exists(expected_filename) + assert os.path.getsize(expected_filename) == os.path.getsize(comparison_filename) + @pytest.mark.parametrize( 'data_type, config_list, expected_list', [ @@ -788,14 +750,17 @@ def test_run_stat_analysis(metplus_config): ('OBS', '\"(0,*,*)\", \"(1,*,*)\"', ["0,*,*", "1,*,*"]), ] ) +@pytest.mark.plotting def test_get_level_list(metplus_config, data_type, config_list, expected_list): config = metplus_config() config.set('config', f'{data_type}_LEVEL_LIST', config_list) saw = StatAnalysisWrapper(config) - assert(saw.get_level_list(data_type) == expected_list) + assert saw.get_level_list(data_type) == expected_list + +@pytest.mark.plotting def test_get_config_file(metplus_config): fake_config_name = '/my/config/file' config = metplus_config() diff --git a/internal_tests/pytests/stat_analysis/test_stat_analysis_plotting.py b/internal_tests/pytests/wrappers/stat_analysis/test_stat_analysis_plotting.py similarity index 77% rename from internal_tests/pytests/stat_analysis/test_stat_analysis_plotting.py rename to internal_tests/pytests/wrappers/stat_analysis/test_stat_analysis_plotting.py index 01ed2be651..e869b5d580 100644 --- a/internal_tests/pytests/stat_analysis/test_stat_analysis_plotting.py +++ b/internal_tests/pytests/wrappers/stat_analysis/test_stat_analysis_plotting.py @@ -1,48 +1,17 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 -import os -import datetime -import sys -import logging import pytest -import datetime -import glob - -import produtil.setup -from metplus.wrappers.stat_analysis_wrapper import StatAnalysisWrapper -from metplus.util import met_util as util +import os -# -# These are tests (not necessarily unit tests) for the -# MET stat_analysis wrapper, stat_analysis_wrapper.py -# NOTE: This test requires pytest, which is NOT part of the standard Python -# library. -# These tests require one configuration file in addition to the three -# required METplus configuration files: test_stat_analysis.conf. This contains -# the information necessary for running all the tests. Each test can be -# customized to replace various settings if needed. -# +import glob -# -# -----------Mandatory----------- -# configuration and fixture to support METplus configuration files beyond -# the metplus_data, metplus_system, and metplus_runtime conf files. -# +from metplus.wrappers.stat_analysis_wrapper import StatAnalysisWrapper +from metplus.util import handle_tmp_dir +METPLUS_BASE = os.getcwd().split('/internal_tests')[0] -# Add a test configuration -def pytest_addoption(parser): - parser.addoption("-c", action="store", help=" -c ") -# @pytest.fixture -def cmdopt(request): - return request.config.getoption("-c") - -# -# ------------Pytest fixtures that can be used for all tests --------------- -# -#@pytest.fixture def stat_analysis_wrapper(metplus_config): """! Returns a default StatAnalysisWrapper with /path/to entries in the metplus_system.conf and metplus_runtime.conf configuration @@ -54,39 +23,11 @@ def stat_analysis_wrapper(metplus_config): extra_configs = [] extra_configs.append(os.path.join(os.path.dirname(__file__), 'test_plotting.conf')) config = metplus_config(extra_configs) - util.handle_tmp_dir(config) + handle_tmp_dir(config) return StatAnalysisWrapper(config) -# ------------------TESTS GO BELOW --------------------------- -# - -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# To test numerous files for filesize, use parametrization: -# @pytest.mark.parametrize( -# 'key, value', [ -# ('/usr/local/met-6.1/bin/point_stat', 382180), -# ('/usr/local/met-6.1/bin/stat_analysis', 3438944), -# ('/usr/local/met-6.1/bin/pb2nc', 3009056) -# -# ] -# ) -# def test_file_sizes(key, value): -# st = stat_analysis_wrapper() -# # Retrieve the value of the class attribute that corresponds -# # to the key in the parametrization -# files_in_dir = [] -# for dirpath, dirnames, files in os.walk("/usr/local/met-6.1/bin"): -# for name in files: -# files_in_dir.append(os.path.join(dirpath, name)) -# if actual_key in files_in_dir: -# # The actual_key is one of the files of interest we retrieved from -# # the output directory. Verify that it's file size is what we -# # expected. -# assert actual_key == key -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -METPLUS_BASE = os.getcwd().split('/internal_tests')[0] - +@pytest.mark.plotting def test_set_lists_as_loop_or_group(metplus_config): # Independently test that the lists that are set # in the config file are being set @@ -148,6 +89,7 @@ def test_set_lists_as_loop_or_group(metplus_config): for elem in test_lists_to_loop_items)) +@pytest.mark.plotting def test_get_output_filename(metplus_config): # Independently test the building of # the output file name @@ -218,66 +160,10 @@ def test_get_output_filename(metplus_config): lists_to_loop, lists_to_group, config_dict) - assert (expected_output_filename == test_output_filename) - + assert expected_output_filename == test_output_filename -def test_parse_model_info(metplus_config): - pytest.skip("This function will be removed from MakePlots") - # Independently test the creation of - # the model information dictionary - # and the reading from the config file - # are as expected - st = stat_analysis_wrapper(metplus_config) - # Test 1 - expected_name1 = 'MODEL_TEST1' - expected_reference_name1 = 'MODEL_TEST1' - expected_obtype1 = 'MODEL_TEST1_ANL' - expected_dump_row_filename_template1 = ( - '{model?fmt=%s}_{obtype?fmt=%s}_valid{valid_beg?fmt=%Y%m%d}' - 'to{valid_end?fmt=%Y%m%d}_valid{valid_hour_beg?fmt=%H%M}to' - '{valid_hour_end?fmt=%H%M}Z_init{init_hour_beg?fmt=%H%M}to' - '{init_hour_end?fmt=%H%M}Z_fcst_lead{fcst_lead?fmt=%s}_' - 'fcst{fcst_var?fmt=%s}{fcst_level?fmt=%s}{fcst_thresh?fmt=%s}' - '{interp_mthd?fmt=%s}_obs{obs_var?fmt=%s}{obs_level?fmt=%s}' - '{obs_thresh?fmt=%s}{interp_mthd?fmt=%s}_vxmask{vx_mask?fmt=%s}' - '_dump_row.stat' - ) - expected_dump_row_filename_type1 = 'user' - expected_out_stat_filename_template1 = 'NA' - expected_out_stat_filename_type1 = 'NA' - expected_name2 = 'TEST2_MODEL' - expected_reference_name2 = 'TEST2_MODEL' - expected_obtype2 = 'ANLYS2' - expected_dump_row_filename_template2 = expected_dump_row_filename_template1 - expected_dump_row_filename_type2 = 'user' - expected_out_stat_filename_template2 = 'NA' - expected_out_stat_filename_type2 = 'NA' - test_model_info_list = st.parse_model_info() - assert (test_model_info_list[0]['name'] == expected_name1) - assert (test_model_info_list[0]['reference_name'] == - expected_reference_name1) - assert (test_model_info_list[0]['obtype'] == expected_obtype1) - assert (test_model_info_list[0]['dump_row_filename_template'] == - expected_dump_row_filename_template1) - assert (test_model_info_list[0]['dump_row_filename_type'] == - expected_dump_row_filename_type1) - assert (test_model_info_list[0]['out_stat_filename_template'] == - expected_out_stat_filename_template1) - assert (test_model_info_list[0]['out_stat_filename_type'] == - expected_out_stat_filename_type1) - assert (test_model_info_list[1]['name'] == expected_name2) - assert (test_model_info_list[1]['reference_name'] == - expected_reference_name2) - assert (test_model_info_list[1]['obtype'] == expected_obtype2) - assert (test_model_info_list[1]['dump_row_filename_template'] == - expected_dump_row_filename_template2) - assert (test_model_info_list[1]['dump_row_filename_type'] == - expected_dump_row_filename_type2) - assert (test_model_info_list[1]['out_stat_filename_template'] == - expected_out_stat_filename_template2) - assert (test_model_info_list[1]['out_stat_filename_type'] == - expected_out_stat_filename_type2) +@pytest.mark.plotting def test_filter_for_plotting(metplus_config): # Test running of stat_analysis st = stat_analysis_wrapper(metplus_config) @@ -510,6 +396,6 @@ def test_filter_for_plotting(metplus_config): os.listdir(st.config.getdir('OUTPUT_BASE') +'/plotting/stat_analysis') ) - assert(ntest_files == 32) + assert ntest_files == 32 for expected_filename in expected_filename_list: - assert(os.path.exists(expected_filename)) + assert os.path.exists(expected_filename) diff --git a/internal_tests/pytests/tc_gen/test_tc_gen_wrapper.py b/internal_tests/pytests/wrappers/tc_gen/test_tc_gen_wrapper.py similarity index 97% rename from internal_tests/pytests/tc_gen/test_tc_gen_wrapper.py rename to internal_tests/pytests/wrappers/tc_gen/test_tc_gen_wrapper.py index 575fd2bf6e..d424abbeae 100644 --- a/internal_tests/pytests/tc_gen/test_tc_gen_wrapper.py +++ b/internal_tests/pytests/wrappers/tc_gen/test_tc_gen_wrapper.py @@ -1,12 +1,12 @@ #!/usr/bin/env python3 -import os -import sys import pytest -import datetime + +import os from metplus.wrappers.tc_gen_wrapper import TCGenWrapper + @pytest.mark.parametrize( 'config_overrides, env_var_values', [ @@ -285,6 +285,7 @@ ] ) +@pytest.mark.wrapper_a def test_tc_gen(metplus_config, config_overrides, env_var_values): # expected number of 2016 files (including file_list line) expected_genesis_count = 7 @@ -382,11 +383,11 @@ def test_tc_gen(metplus_config, config_overrides, env_var_values): all_cmds = wrapper.run_all_times() print(f"ALL COMMANDS: {all_cmds}") - assert(len(all_cmds) == len(expected_cmds)) + assert len(all_cmds) == len(expected_cmds) for (cmd, env_vars), expected_cmd in zip(all_cmds, expected_cmds): # ensure commands are generated as expected - assert(cmd == expected_cmd) + assert cmd == expected_cmd # check that environment variables were set properly # including deprecated env vars (not in wrapper env var keys) @@ -396,27 +397,29 @@ def test_tc_gen(metplus_config, config_overrides, env_var_values): for env_var_key in env_var_keys: match = next((item for item in env_vars if item.startswith(env_var_key)), None) - assert(match is not None) + assert match is not None value = match.split('=', 1)[1] - assert(env_var_values.get(env_var_key, '') == value) + assert env_var_values.get(env_var_key, '') == value # verify file count of genesis, edeck, shape, and track file list files with open(genesis_path, 'r') as file_handle: lines = file_handle.read().splitlines() - assert(len(lines) == expected_genesis_count) + assert len(lines) == expected_genesis_count with open(edeck_path, 'r') as file_handle: lines = file_handle.read().splitlines() - assert(len(lines) == expected_edeck_count) + assert len(lines) == expected_edeck_count with open(shape_path, 'r') as file_handle: lines = file_handle.read().splitlines() - assert(len(lines) == expected_shape_count) + assert len(lines) == expected_shape_count with open(track_path, 'r') as file_handle: lines = file_handle.read().splitlines() - assert(len(lines) == expected_track_count) + assert len(lines) == expected_track_count + +@pytest.mark.wrapper_a def test_get_config_file(metplus_config): fake_config_name = '/my/config/file' diff --git a/internal_tests/pytests/tc_pairs/tc_pairs_wrapper_test.conf b/internal_tests/pytests/wrappers/tc_pairs/tc_pairs_wrapper_test.conf similarity index 100% rename from internal_tests/pytests/tc_pairs/tc_pairs_wrapper_test.conf rename to internal_tests/pytests/wrappers/tc_pairs/tc_pairs_wrapper_test.conf diff --git a/internal_tests/pytests/tc_pairs/test_tc_pairs_wrapper.py b/internal_tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py similarity index 96% rename from internal_tests/pytests/tc_pairs/test_tc_pairs_wrapper.py rename to internal_tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py index a0845be227..265564a29b 100644 --- a/internal_tests/pytests/tc_pairs/test_tc_pairs_wrapper.py +++ b/internal_tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 +import pytest + import os from datetime import datetime -import pytest from metplus.wrappers.tc_pairs_wrapper import TCPairsWrapper @@ -15,6 +16,7 @@ time_fmt = '%Y%m%d%H' run_times = ['2014121318'] + def set_minimum_config_settings(config, loop_by='INIT'): # set config variables to prevent command from running and bypass check # if input files actually exist @@ -41,6 +43,7 @@ def set_minimum_config_settings(config, loop_by='INIT'): # can set adeck or edeck variables config.set('config', 'TC_PAIRS_ADECK_TEMPLATE', adeck_template) + @pytest.mark.parametrize( 'config_overrides, isOK', [ ({}, True), @@ -80,6 +83,7 @@ def test_read_storm_info(metplus_config, config_overrides, isOK): ('2020100700_F000_261N_1101W_FOF', 'wildcard', 'wildcard'), ] ) +@pytest.mark.wrapper def test_parse_storm_id(metplus_config, storm_id, basin, cyclone): """! Check that storm ID is parsed properly to get basin and cyclone. Check that it returns wildcard expressions basin and cyclone cannot be @@ -107,6 +111,7 @@ def test_parse_storm_id(metplus_config, storm_id, basin, cyclone): assert actual_basin == expected_basin assert actual_cyclone == expected_cyclone + @pytest.mark.parametrize( 'basin,cyclone,expected_files,expected_wildcard', [ ('al', '0104', ['get_bdeck_balq2014123118.gfso.0104'], False), @@ -123,6 +128,7 @@ def test_parse_storm_id(metplus_config, storm_id, basin, cyclone): 'get_bdeck_bmlq2014123118.gfso.0105'], True), ] ) +@pytest.mark.wrapper def test_get_bdeck(metplus_config, basin, cyclone, expected_files, expected_wildcard): """! Checks that the correct list of empty test files are found and the @@ -150,11 +156,12 @@ def test_get_bdeck(metplus_config, basin, cyclone, expected_files, wrapper = TCPairsWrapper(config) actual_files, actual_wildcard = wrapper._get_bdeck(basin, cyclone, time_info) - assert(actual_wildcard == expected_wildcard) - assert(len(actual_files) == len(expected_files)) + assert actual_wildcard == expected_wildcard + assert len(actual_files) == len(expected_files) for actual_file, expected_file in zip(sorted(actual_files), sorted(expected_files)): - assert(os.path.basename(actual_file) == expected_file) + assert os.path.basename(actual_file) == expected_file + @pytest.mark.parametrize( 'template, filename,other_basin,other_cyclone', [ @@ -178,6 +185,7 @@ def test_get_bdeck(metplus_config, basin, cyclone, expected_files, '20141009bml.dat', 'ml', None), ] ) +@pytest.mark.wrapper def test_get_basin_cyclone_from_bdeck(metplus_config, template, filename, other_cyclone, other_basin): fake_dir = '/fake/dir' @@ -210,6 +218,7 @@ def test_get_basin_cyclone_from_bdeck(metplus_config, template, filename, assert actual_basin == expected_basin assert actual_cyclone == expected_cyclone + @pytest.mark.parametrize( 'config_overrides, storm_type, values_to_check', [ # 0: storm_id @@ -231,6 +240,7 @@ def test_get_basin_cyclone_from_bdeck(metplus_config, template, filename, 'cyclone', ['09', '10', '09', '10']), ] ) +@pytest.mark.wrapper def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, storm_type, values_to_check): config = metplus_config() @@ -272,20 +282,21 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, print(f"CMD{idx}: {cmd}") print(f"ENV{idx}: {env_list}") - assert(len(all_cmds) == len(values_to_check)) + assert len(all_cmds) == len(values_to_check) for (cmd, env_vars), value_to_check in zip(all_cmds, values_to_check): env_var_key = f'METPLUS_{storm_type.upper()}' match = next((item for item in env_vars if item.startswith(env_var_key)), None) - assert (match is not None) + assert match is not None print(f"Checking env var: {env_var_key}") actual_value = match.split('=', 1)[1] expected_value = f'{storm_type} = ["{value_to_check}"];' assert actual_value == expected_value + @pytest.mark.parametrize( 'config_overrides, env_var_values', [ # 0: no config overrides that set env vars @@ -370,6 +381,7 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, ] ) +@pytest.mark.wrapper def test_tc_pairs_loop_order_processes(metplus_config, config_overrides, env_var_values): # run using init and valid time variables @@ -425,26 +437,27 @@ def test_tc_pairs_loop_order_processes(metplus_config, config_overrides, all_cmds = wrapper.run_all_times() print(f"ALL COMMANDS: {all_cmds}") - assert(len(all_cmds) == len(expected_cmds)) + assert len(all_cmds) == len(expected_cmds) for (cmd, env_vars), expected_cmd in zip(all_cmds, expected_cmds): # ensure commands are generated as expected - assert(cmd == expected_cmd) + assert cmd == expected_cmd # check that environment variables were set properly for env_var_key in wrapper.WRAPPER_ENV_VAR_KEYS: match = next((item for item in env_vars if item.startswith(env_var_key)), None) - assert(match is not None) + assert match is not None print(f'Checking env var: {env_var_key}') actual_value = match.split('=', 1)[1] - assert(env_var_values.get(env_var_key, '') == actual_value) + assert env_var_values.get(env_var_key, '') == actual_value if remove_beg: del env_var_values[f'METPLUS_{loop_by}_BEG'] if remove_end: del env_var_values[f'METPLUS_{loop_by}_END'] + @pytest.mark.parametrize( 'config_overrides, env_var_values', [ # 0: no config overrides that set env vars @@ -460,6 +473,7 @@ def test_tc_pairs_loop_order_processes(metplus_config, config_overrides, {'METPLUS_CYCLONE': 'cyclone = ["1005", "0104"];'}), ] ) +@pytest.mark.wrapper def test_tc_pairs_read_all_files(metplus_config, config_overrides, env_var_values): # run using init and valid time variables @@ -512,22 +526,24 @@ def test_tc_pairs_read_all_files(metplus_config, config_overrides, all_cmds = wrapper.run_all_times() print(f"ALL COMMANDS: {all_cmds}") - assert(len(all_cmds) == len(expected_cmds)) + assert len(all_cmds) == len(expected_cmds) for (cmd, env_vars), expected_cmd in zip(all_cmds, expected_cmds): # check that environment variables were set properly for env_var_key in wrapper.WRAPPER_ENV_VAR_KEYS: match = next((item for item in env_vars if item.startswith(env_var_key)), None) - assert(match is not None) + assert match is not None print(f'Checking env var: {env_var_key}') actual_value = match.split('=', 1)[1] - assert(env_var_values.get(env_var_key, '') == actual_value) + assert env_var_values.get(env_var_key, '') == actual_value # unset begin and end for next loop del env_var_values[f'METPLUS_{loop_by}_BEG'] del env_var_values[f'METPLUS_{loop_by}_END'] + +@pytest.mark.wrapper def test_get_config_file(metplus_config): fake_config_name = '/my/config/file' diff --git a/internal_tests/pytests/tc_stat/tc_stat_conf.conf b/internal_tests/pytests/wrappers/tc_stat/tc_stat_conf.conf similarity index 100% rename from internal_tests/pytests/tc_stat/tc_stat_conf.conf rename to internal_tests/pytests/wrappers/tc_stat/tc_stat_conf.conf diff --git a/internal_tests/pytests/tc_stat/test_tc_stat_wrapper.py b/internal_tests/pytests/wrappers/tc_stat/test_tc_stat_wrapper.py similarity index 98% rename from internal_tests/pytests/tc_stat/test_tc_stat_wrapper.py rename to internal_tests/pytests/wrappers/tc_stat/test_tc_stat_wrapper.py index e84b90b09a..fe66cff3f8 100644 --- a/internal_tests/pytests/tc_stat/test_tc_stat_wrapper.py +++ b/internal_tests/pytests/wrappers/tc_stat/test_tc_stat_wrapper.py @@ -1,21 +1,22 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 + +import pytest import os import sys -import pytest import datetime -import produtil - from metplus.wrappers.tc_stat_wrapper import TCStatWrapper from metplus.util import ti_calculate + def get_config(metplus_config): extra_configs = [] extra_configs.append(os.path.join(os.path.dirname(__file__), 'tc_stat_conf.conf')) return metplus_config(extra_configs) + def tc_stat_wrapper(metplus_config): """! Returns a default TCStatWrapper with /path/to entries in the metplus_system.conf and metplus_runtime.conf configuration @@ -27,6 +28,7 @@ def tc_stat_wrapper(metplus_config): config = get_config(metplus_config) return TCStatWrapper(config) + @pytest.mark.parametrize( 'overrides, c_dict', [ ({'TC_STAT_INIT_BEG': '20150301', @@ -106,7 +108,8 @@ def tc_stat_wrapper(metplus_config): 'INIT_STR_EXC_VAL': 'init_str_exc_val = ["HUWARN"];'}), ] - ) +) +@pytest.mark.wrapper def test_override_config_in_c_dict(metplus_config, overrides, c_dict): config = get_config(metplus_config) instance = 'tc_stat_overrides' @@ -119,6 +122,7 @@ def test_override_config_in_c_dict(metplus_config, overrides, c_dict): assert (wrapper.env_var_dict.get(f'METPLUS_{key}') == expected_value or wrapper.c_dict.get(key) == expected_value) + @pytest.mark.parametrize( 'jobs, init_dt, expected_output', [ # single fake job @@ -143,6 +147,7 @@ def test_override_config_in_c_dict(metplus_config, overrides, c_dict): ), ] ) +@pytest.mark.wrapper def test_handle_jobs(metplus_config, jobs, init_dt, expected_output): if init_dt: time_info = ti_calculate({'init': init_dt}) @@ -158,7 +163,7 @@ def test_handle_jobs(metplus_config, jobs, init_dt, expected_output): wrapper.c_dict['JOBS'].append(job.replace('', output_dir)) output = wrapper.handle_jobs(time_info) - assert(output == expected_output.replace('', output_dir)) + assert output == expected_output.replace('', output_dir) def cleanup_test_dirs(parent_dirs, output_dir): @@ -168,6 +173,7 @@ def cleanup_test_dirs(parent_dirs, output_dir): if os.path.exists(parent_dir_sub): os.removedirs(parent_dir_sub) + @pytest.mark.parametrize( 'jobs, init_dt, expected_output, parent_dirs', [ # single fake job, no parent dir @@ -216,6 +222,7 @@ def cleanup_test_dirs(parent_dirs, output_dir): ), ] ) +@pytest.mark.wrapper def test_handle_jobs_create_parent_dir(metplus_config, jobs, init_dt, expected_output, parent_dirs): # if init time is provided, calculate other time dict items @@ -254,6 +261,7 @@ def test_handle_jobs_create_parent_dir(metplus_config, jobs, init_dt, cleanup_test_dirs(parent_dirs, output_dir) +@pytest.mark.wrapper def test_get_config_file(metplus_config): fake_config_name = '/my/config/file' diff --git a/internal_tests/pytests/user_script/test_user_script.py b/internal_tests/pytests/wrappers/user_script/test_user_script.py similarity index 99% rename from internal_tests/pytests/user_script/test_user_script.py rename to internal_tests/pytests/wrappers/user_script/test_user_script.py index de69d76340..b45fe88108 100644 --- a/internal_tests/pytests/user_script/test_user_script.py +++ b/internal_tests/pytests/wrappers/user_script/test_user_script.py @@ -1,17 +1,13 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 -import os -import sys -import re -import logging -from collections import namedtuple import pytest + +import re from datetime import datetime -import produtil from metplus.wrappers.user_script_wrapper import UserScriptWrapper -from metplus.util import time_util + def sub_clock_time(input_cmd, clock_time): """! Helper function to replace clock time from config in expected output @@ -54,6 +50,7 @@ def sub_clock_time(input_cmd, clock_time): return output_cmd + def set_run_type_info(config, run_type): """! Set time values for init or valid time in config object @@ -347,6 +344,7 @@ def set_run_type_info(config, run_type): ['echo a'] * 12 + ['echo b'] * 12), ] ) +@pytest.mark.wrapper def test_run_user_script_all_times(metplus_config, input_configs, run_types, expected_cmds): config = metplus_config() diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 81aa3b4000..e37b0466e5 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -52,7 +52,7 @@ Category: met_tool_wrapper 50::met_tool_wrapper/UserScript/UserScript_run_once_per_init.conf 51::met_tool_wrapper/UserScript/UserScript_run_once_per_lead.conf 52::met_tool_wrapper/UserScript/UserScript_run_once_per_valid.conf -53::METdbLoad::met_tool_wrapper/METdbLoad/METdbLoad.conf:: metdatadb_env,metviewer +53::METdbLoad::met_tool_wrapper/METdbLoad/METdbLoad.conf:: metdataio_env,metviewer 54::ExtractTiles_mtd::met_tool_wrapper/ExtractTiles/ExtractTiles_mtd.conf 55::GFDLTracker_TC::met_tool_wrapper/GFDLTracker/GFDLTracker_TC.conf::gfdl-tracker_env 56::GFDLTracker_ETC::met_tool_wrapper/GFDLTracker/GFDLTracker_ETC.conf::gfdl-tracker_env @@ -70,17 +70,17 @@ Category: climate 1::MODE_fcstCESM_obsGPCP_AsianMonsoonPrecip::model_applications/climate/MODE_fcstCESM_obsGPCP_AsianMonsoonPrecip.conf -Category: convection_allowing_models -0::EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField::model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf -1::MODE_fcstHRRR_obsMRMS_Hail_GRIB2::model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf -2::EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere::model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf -3::GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere::model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf -4::GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb::model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf -5::Point2Grid_obsLSR_ObsOnly_PracticallyPerfect::model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf -6::GridStat_fcstFV3_obsGOES_BrightnessTempDmap:: model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf -7::MODE_fcstFV3_obsGOES_BrightnessTemp::model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf,model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf -8::MODE_fcstFV3_obsGOES_BrightnessTempObjs:: model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf -9::METdbLoad_fcstFV3_obsGoes_BrightnessTemp::model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf:: metdatadb_env,metviewer +Category: short_range +0::EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField::model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf +1::MODE_fcstHRRR_obsMRMS_Hail_GRIB2::model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf +2::EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere::model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf +3::GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere::model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +4::GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb::model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf +5::Point2Grid_obsLSR_ObsOnly_PracticallyPerfect::model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf +6::GridStat_fcstFV3_obsGOES_BrightnessTempDmap:: model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf +7::MODE_fcstFV3_obsGOES_BrightnessTemp::model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf,model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf +8::MODE_fcstFV3_obsGOES_BrightnessTempObjs:: model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf +9::METdbLoad_fcstFV3_obsGoes_BrightnessTemp::model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf:: metdataio_env,metviewer Category: data_assimilation @@ -125,19 +125,26 @@ Category: precipitation Category: s2s 0::GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf:: netcdf4_env -1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf:: metplotpy_env,cartopy,metplus -2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf:: metplotpy_env,cartopy,metplus -3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf:: weatherregime_env,cartopy,metplus -4::TCGen_fcstGFSO_obsBDECKS_GDF_TDF:: model_applications/s2s/TCGen_fcstGFSO_obsBDECKS_GDF_TDF.conf:: metplotpy_env,cartopy,metplus -5::UserScript_obsPrecip_obsOnly_Hovmoeller:: model_applications/s2s/UserScript_obsPrecip_obsOnly_Hovmoeller.conf:: metplotpy_env,cartopy -6:: UserScript_obsPrecip_obsOnly_CrossSpectraPlot:: model_applications/s2s/UserScript_obsPrecip_obsOnly_CrossSpectraPlot.conf:: spacetime_env -7:: UserScript_obsERA_obsOnly_PhaseDiagram:: model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf:: spacetime_env -8:: UserScript_fcstGFS_obsERA_OMI:: model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf:: spacetime_env, metdatadb -9:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdatadb -10:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdatadb -11:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus -12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf:: metplotpy_env,metdatadb -13::SeriesAnalysis_fcstCFSv2_obsGHCNCAMS_climoStandardized_MultiStatisticTool:: model_applications/s2s/SeriesAnalysis_fcstCFSv2_obsGHCNCAMS_climoStandardized_MultiStatisticTool.conf:: netcdf4_env +1::TCGen_fcstGFSO_obsBDECKS_GDF_TDF:: model_applications/s2s/TCGen_fcstGFSO_obsBDECKS_GDF_TDF.conf:: metplotpy_env,cartopy,metplus +2::UserScript_obsPrecip_obsOnly_Hovmoeller:: model_applications/s2s/UserScript_obsPrecip_obsOnly_Hovmoeller.conf:: metplotpy_env,cartopy +3:: UserScript_obsPrecip_obsOnly_CrossSpectraPlot:: model_applications/s2s/UserScript_obsPrecip_obsOnly_CrossSpectraPlot.conf:: spacetime_env +4:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf:: metplotpy_env,metdataio +5::SeriesAnalysis_fcstCFSv2_obsGHCNCAMS_climoStandardized_MultiStatisticTool:: model_applications/s2s/SeriesAnalysis_fcstCFSv2_obsGHCNCAMS_climoStandardized_MultiStatisticTool.conf:: netcdf4_env +6::GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile:: model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf:: netcdf4_env + + +Category: s2s_mid_lat +0::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.conf:: metplotpy_env,cartopy,metplus +1::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.conf:: metplotpy_env,cartopy,metplus +2::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.conf:: weatherregime_env,cartopy,metplus +3:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus + +Category: s2s_mjo +0:: UserScript_obsERA_obsOnly_PhaseDiagram:: model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf:: spacetime_env +1:: UserScript_fcstGFS_obsERA_OMI:: model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf:: spacetime_env, metdataio +2:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdataio +3:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdataio + Category: space_weather 0::GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf diff --git a/internal_tests/use_cases/metplus_use_case_suite.py b/internal_tests/use_cases/metplus_use_case_suite.py index 5f0397afb5..d194b4c3ae 100644 --- a/internal_tests/use_cases/metplus_use_case_suite.py +++ b/internal_tests/use_cases/metplus_use_case_suite.py @@ -403,8 +403,14 @@ def parse_all_use_cases_file(): num_cases += 1 return all_cases, num_cases - +################################################################################ if __name__ == "__main__": + # NOTE: This list of use cases to run is not maintaned, so it no longer + # contains the full list of existing use cases. + # It is not recommended to run the use cases by calling this script + # directly. This more serves as a reference of how use case commands + # can be generated. + # run all use cases all_use_cases = METplusUseCaseSuite() @@ -412,8 +418,6 @@ def parse_all_use_cases_file(): all_use_cases.add_use_case_groups('climate') - all_use_cases.add_use_case_groups('convection_allowing_models') - all_use_cases.add_use_case_groups('cryosphere') all_use_cases.add_use_case_groups('data_assimilation') @@ -430,6 +434,8 @@ def parse_all_use_cases_file(): all_use_cases.add_use_case_groups('precipitation') + all_use_cases.add_use_case_groups('short_range') + all_use_cases.add_use_case_groups('s2s&space_weather&tc_and_extra_tc') all_use_cases.print() diff --git a/internal_tests/use_cases/test_use_cases.py b/internal_tests/use_cases/test_use_cases.py index f70bcfeb24..0f62f41645 100644 --- a/internal_tests/use_cases/test_use_cases.py +++ b/internal_tests/use_cases/test_use_cases.py @@ -120,12 +120,14 @@ def main(): parser.add_argument('host_id', action='store') parser.add_argument('--met_tool_wrapper', action='store_true', required=False) parser.add_argument('--climate', action='store_true', required=False) - parser.add_argument('--convection_allowing_models', action='store_true', required=False) parser.add_argument('--cryosphere', action='store_true', required=False) parser.add_argument('--medium_range1', action='store_true', required=False) parser.add_argument('--medium_range2', action='store_true', required=False) parser.add_argument('--precipitation', action='store_true', required=False) + parser.add_argument('--short_range', action='store_true', required=False) parser.add_argument('--s2s', action='store_true', required=False) + parser.add_argument('--s2s_mid_lat', action='store_true', required=False) + parser.add_argument('--s2s_mjo', action='store_true', required=False) parser.add_argument('--space_weather', action='store_true', required=False) parser.add_argument('--tc_and_extra_tc', action='store_true', required=False) parser.add_argument('--all', action='store_true', required=False) diff --git a/metplus/util/time_looping.py b/metplus/util/time_looping.py index 0632b17639..f2e771430d 100644 --- a/metplus/util/time_looping.py +++ b/metplus/util/time_looping.py @@ -12,7 +12,7 @@ def time_generator(config): Yields the next run time dictionary or None if something went wrong """ # determine INIT or VALID prefix - prefix = get_time_prefix(config) + prefix = _get_time_prefix(config) if not prefix: yield None return @@ -82,6 +82,44 @@ def time_generator(config): current_dt += time_interval +def get_start_and_end_times(config): + prefix = _get_time_prefix(config) + if not prefix: + return None, None + + # get clock time of when the run started + clock_dt = datetime.strptime( + config.getstr('config', 'CLOCK_TIME'), + '%Y%m%d%H%M%S' + ) + + time_format = config.getraw('config', f'{prefix}_TIME_FMT', '') + if not time_format: + config.logger.error(f'Could not read {prefix}_TIME_FMT') + return None, None + + start_string = config.getraw('config', f'{prefix}_BEG') + end_string = config.getraw('config', f'{prefix}_END', start_string) + + start_dt = _get_current_dt(start_string, + time_format, + clock_dt, + config.logger) + + end_dt = _get_current_dt(end_string, + time_format, + clock_dt, + config.logger) + + if not _validate_time_values(start_dt, + end_dt, + get_relativedelta('60'), + prefix, + config.logger): + return None, None + + return start_dt, end_dt + def _validate_time_values(start_dt, end_dt, time_interval, prefix, logger): if not start_dt: logger.error(f"Could not read {prefix}_BEG") @@ -95,7 +133,7 @@ def _validate_time_values(start_dt, end_dt, time_interval, prefix, logger): if (start_dt + time_interval < start_dt + timedelta(seconds=60)): logger.error(f'{prefix}_INCREMENT must be greater than or ' - 'equal to 60 seconds') + 'equal to 60 seconds') return False if start_dt > end_dt: @@ -109,9 +147,10 @@ def _create_time_input_dict(prefix, current_dt, clock_dt): 'loop_by': prefix.lower(), prefix.lower(): current_dt, 'now': clock_dt, + 'today': clock_dt.strftime('%Y%m%d'), } -def get_time_prefix(config): +def _get_time_prefix(config): """! Read the METplusConfig object and determine the prefix for the time looping variables. diff --git a/metplus/util/time_util.py b/metplus/util/time_util.py index 92f651435b..4eb180f30e 100755 --- a/metplus/util/time_util.py +++ b/metplus/util/time_util.py @@ -138,7 +138,7 @@ def ti_get_seconds_from_relativedelta(lead, valid_time=None): return None # if valid time is specified, use it to determine seconds - if valid_time is not None: + if valid_time: return int((valid_time - (valid_time - lead)).total_seconds()) if lead.months != 0 or lead.years != 0: diff --git a/metplus/wrappers/met_db_load_wrapper.py b/metplus/wrappers/met_db_load_wrapper.py index 63fe189714..e5a8783935 100755 --- a/metplus/wrappers/met_db_load_wrapper.py +++ b/metplus/wrappers/met_db_load_wrapper.py @@ -148,7 +148,7 @@ def run_at_time_once(self, time_info): return success def get_all_files(self, custom=None): - """! Don't get list of all files for METdataDB wrapper + """! Don't get list of all files for METdbLoad wrapper @returns True to report that no failures occurred """ diff --git a/metplus/wrappers/stat_analysis_wrapper.py b/metplus/wrappers/stat_analysis_wrapper.py index 8a7ceee315..de313014ca 100755 --- a/metplus/wrappers/stat_analysis_wrapper.py +++ b/metplus/wrappers/stat_analysis_wrapper.py @@ -22,6 +22,7 @@ from ..util import met_util as util from ..util import do_string_sub, find_indices_in_config_section from ..util import parse_var_list, remove_quotes +from ..util import get_start_and_end_times from . import CommandBuilder class StatAnalysisWrapper(CommandBuilder): @@ -177,13 +178,18 @@ def create_c_dict(self): 'LOOP_BY', '')) - for time_conf in ['VALID_BEG', 'VALID_END', 'INIT_BEG', 'INIT_END']: - c_dict[time_conf] = self.config.getstr('config', time_conf, '') + start_dt, end_dt = get_start_and_end_times(self.config) + if not start_dt: + self.log_error('Could not get start and end times. ' + 'VALID_BEG/END or INIT_BEG/END must be set.') + else: + c_dict['DATE_BEG'] = start_dt.strftime('%Y%m%d') + c_dict['DATE_END'] = end_dt.strftime('%Y%m%d') for job_conf in ['JOB_NAME', 'JOB_ARGS']: c_dict[job_conf] = self.config.getstr('config', - f'STAT_ANALYSIS_{job_conf}', - '') + f'STAT_ANALYSIS_{job_conf}', + '') # read in all lists except field lists, which will be read in afterwards and checked all_lists_to_read = self.expected_config_lists + self.list_categories @@ -1061,22 +1067,24 @@ def get_lookin_dir(self, dir_path, lists_to_loop, lists_to_group, config_dict): lookin_dir - string of the filled directory from dir_path """ - if '?fmt=' in dir_path: - stringsub_dict = self.build_stringsub_dict(lists_to_loop, - lists_to_group, - config_dict) - dir_path_filled = do_string_sub(dir_path, - **stringsub_dict) - else: - dir_path_filled = dir_path - if '*' in dir_path_filled: - self.logger.debug(f"Expanding wildcard path: {dir_path_filled}") - dir_path_filled_all = ' '.join(sorted(glob.glob(dir_path_filled))) - self.logger.warning(f"Wildcard expansion found no matches") - else: - dir_path_filled_all = dir_path_filled - lookin_dir = dir_path_filled_all - return lookin_dir + stringsub_dict = self.build_stringsub_dict(lists_to_loop, + lists_to_group, + config_dict) + dir_path_filled = do_string_sub(dir_path, + **stringsub_dict) + + all_paths = [] + for one_path in dir_path_filled.split(','): + if '*' in one_path: + self.logger.debug(f"Expanding wildcard path: {one_path}") + expand_path = glob.glob(one_path.strip()) + if not expand_path: + self.logger.warning(f"Wildcard expansion found no matches") + continue + all_paths.extend(sorted(expand_path)) + else: + all_paths.append(one_path.strip()) + return ' '.join(all_paths) def format_valid_init(self, config_dict): """! Format the valid and initialization dates and @@ -1811,7 +1819,7 @@ def run_stat_analysis_job(self, runtime_settings_dict_list): self.set_environment_variables() # set lookin dir - self.logger.debug(f"Setting -lookindir to {runtime_settings_dict['LOOKIN_DIR']}") + self.logger.debug(f"Setting -lookin dir to {runtime_settings_dict['LOOKIN_DIR']}") self.lookindir = runtime_settings_dict['LOOKIN_DIR'] self.job_args = runtime_settings_dict['JOB'] @@ -1844,24 +1852,11 @@ def create_output_directories(self, runtime_settings_dict): return run_job def run_all_times(self): - date_type = self.c_dict['DATE_TYPE'] - self.c_dict['DATE_BEG'] = self.c_dict[date_type+'_BEG'] - self.c_dict['DATE_END'] = self.c_dict[date_type+'_END'] self.run_stat_analysis() return self.all_commands def run_at_time(self, input_dict): - loop_by_init = util.is_loop_by_init(self.config) - if loop_by_init is None: - return - - if loop_by_init: - loop_by = 'INIT' - else: - loop_by = 'VALID' - - self.c_dict['DATE_TYPE'] = loop_by - + loop_by = self.c_dict['DATE_TYPE'] run_date = input_dict[loop_by.lower()].strftime('%Y%m%d') self.c_dict['DATE_BEG'] = run_date self.c_dict['DATE_END'] = run_date diff --git a/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC.conf b/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC.conf index ac68fa7113..45c6e7531f 100644 --- a/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC.conf +++ b/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC.conf @@ -1,79 +1,72 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only ASCII2NC for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/ASCII2NC/ASCII2NC.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 = ASCII2NC -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 2010010112 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 2010010112 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 0 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for ASCII2NC only -#LOG_ASCII2NC_VERBOSITY = 1 -# MET Configuration file for ASCII2NC -# References CONFIG_DIR from the [dir] section -ASCII2NC_CONFIG_FILE = {CONFIG_DIR}/Ascii2NcConfig_wrapped +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +ASCII2NC_INPUT_DIR = +ASCII2NC_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_obs/ascii/precip24_{valid?fmt=%Y%m%d%H}.ascii + +ASCII2NC_OUTPUT_DIR = +ASCII2NC_OUTPUT_TEMPLATE = {OUTPUT_BASE}/ascii2nc/precip24_{valid?fmt=%Y%m%d%H}.nc -# If set to True, skip run if the output file determined by the output directory and -# filename template already exists ASCII2NC_SKIP_IF_OUTPUT_EXISTS = False -# Time relative to valid time (in seconds if no units are specified) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. ASCII2NC_FILE_WINDOW_BEGIN = 0 ASCII2NC_FILE_WINDOW_END = 0 -# Value to pass with the -format argument to ascii2nc. See MET User's Guide for more information +### +# ASCII2NC Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#ascii2nc +### + +#LOG_ASCII2NC_VERBOSITY = 1 + +ASCII2NC_CONFIG_FILE = {PARM_BASE}/met_config/Ascii2NcConfig_wrapped + ASCII2NC_INPUT_FORMAT = -# Value to pass with the -mask_grid argument to ascii2nc. See MET User's Guide for more information ASCII2NC_MASK_GRID = - -# Value to pass with the -mask_poly argument to ascii2nc. See MET User's Guide for more information ASCII2NC_MASK_POLY = - -# Value to pass with the -mask_sid argument to ascii2nc. See MET User's Guide for more information ASCII2NC_MASK_SID = -# For defining the time periods for summarization -# False for no time summary, True otherwise -# The rest of the ASCII2NC_TIME_SUMMARY variables are ignored if set to False -# See the MET User's Guide section regarding ASCII2NC time summary options for more information. ASCII2NC_TIME_SUMMARY_FLAG = False ASCII2NC_TIME_SUMMARY_RAW_DATA = False ASCII2NC_TIME_SUMMARY_BEG = 000000 @@ -85,22 +78,3 @@ ASCII2NC_TIME_SUMMARY_VAR_NAMES = ASCII2NC_TIME_SUMMARY_TYPES = min, max, range, mean, stdev, median, p80 ASCII2NC_TIME_SUMMARY_VALID_FREQ = 0 ASCII2NC_TIME_SUMMARY_VALID_THRESH = 0.0 - - -# End of [config] section and start of [dir] section -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config - -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -ASCII2NC_INPUT_DIR = -ASCII2NC_OUTPUT_DIR = - -# End of [dir] section and start of [filename_templates] section -[filename_templates] - -# Template to look for input to ASCII2NC relative to ASCII2NC_INPUT_DIR -ASCII2NC_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_obs/ascii/precip24_{valid?fmt=%Y%m%d%H}.ascii - -# Template to use to write output from ASCII2NC -ASCII2NC_OUTPUT_TEMPLATE = {OUTPUT_BASE}/ascii2nc/precip24_{valid?fmt=%Y%m%d%H}.nc diff --git a/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC_python_embedding.conf b/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC_python_embedding.conf index f9c01839f8..f2e61547f7 100644 --- a/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/ASCII2NC/ASCII2NC_python_embedding.conf @@ -1,84 +1,75 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only ASCII2NC for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/ASCII2NC/ASCII2NC_python_embedding.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 = ASCII2NC -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 2010010112 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 2010010112 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 0 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for ASCII2NC only -#LOG_ASCII2NC_VERBOSITY = 1 -# MET Configuration file for ASCII2NC -# References CONFIG_DIR from the [dir] section -ASCII2NC_CONFIG_FILE = +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +ASCII2NC_INPUT_DIR = +ASCII2NC_INPUT_TEMPLATE = "{MET_INSTALL_DIR}/share/met/python/read_ascii_point.py {INPUT_BASE}/met_test/data/sample_obs/ascii/sample_ascii_obs.txt" + +ASCII2NC_OUTPUT_DIR = +ASCII2NC_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/ASCII2NC/ascii2nc_python.nc -# If set to True, skip run if the output file determined by the output directory and -# filename template already exists ASCII2NC_SKIP_IF_OUTPUT_EXISTS = False -# Time relative to valid time (in seconds if no units are specified) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. ASCII2NC_FILE_WINDOW_BEGIN = 0 ASCII2NC_FILE_WINDOW_END = 0 -# Time relative to each input file's valid time (in seconds if no units are specified) for data within the file to be -# considered valid. + +### +# ASCII2NC Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#ascii2nc +### + +#LOG_ASCII2NC_VERBOSITY = 1 +#ASCII2NC_CONFIG_FILE = + ASCII2NC_WINDOW_BEGIN = 0 ASCII2NC_WINDOW_END = 0 -# Value to pass with the -format argument to ascii2nc. See MET User's Guide for more information ASCII2NC_INPUT_FORMAT = python -# Value to pass with the -mask_grid argument to ascii2nc. See MET User's Guide for more information ASCII2NC_MASK_GRID = - -# Value to pass with the -mask_poly argument to ascii2nc. See MET User's Guide for more information ASCII2NC_MASK_POLY = - -# Value to pass with the -mask_sid argument to ascii2nc. See MET User's Guide for more information ASCII2NC_MASK_SID = -# For defining the time periods for summarization -# False for no time summary, True otherwise -# The rest of the ASCII2NC_TIME_SUMMARY variables are ignored if set to False -# See the MET User's Guide section regarding ASCII2NC time summary options for more information. ASCII2NC_TIME_SUMMARY_FLAG = False ASCII2NC_TIME_SUMMARY_RAW_DATA = False ASCII2NC_TIME_SUMMARY_BEG = 000000 @@ -90,22 +81,3 @@ ASCII2NC_TIME_SUMMARY_VAR_NAMES = ASCII2NC_TIME_SUMMARY_TYPES = min, max, range, mean, stdev, median, p80 ASCII2NC_TIME_SUMMARY_VALID_FREQ = 0 ASCII2NC_TIME_SUMMARY_VALID_THRESH = 0.0 - - -# End of [config] section and start of [dir] section -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config - -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -ASCII2NC_INPUT_DIR = -ASCII2NC_OUTPUT_DIR = - -# End of [dir] section and start of [filename_templates] section -[filename_templates] - -# Template to look for input to ASCII2NC relative to ASCII2NC_INPUT_DIR -ASCII2NC_INPUT_TEMPLATE = "{MET_INSTALL_DIR}/share/met/python/read_ascii_point.py {INPUT_BASE}/met_test/data/sample_obs/ascii/sample_ascii_obs.txt" - -# Template to use to write output from ASCII2NC -ASCII2NC_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/ASCII2NC/ascii2nc_python.nc diff --git a/parm/use_cases/met_tool_wrapper/CyclonePlotter/CyclonePlotter.conf b/parm/use_cases/met_tool_wrapper/CyclonePlotter/CyclonePlotter.conf index aa3d15a506..931f906fb2 100644 --- a/parm/use_cases/met_tool_wrapper/CyclonePlotter/CyclonePlotter.conf +++ b/parm/use_cases/met_tool_wrapper/CyclonePlotter/CyclonePlotter.conf @@ -1,81 +1,55 @@ -[dir] -## Dirs below used by cyclone_plotter_wrapper module. -# -------------------------------------------------- +[config] + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/CyclonePlotter/CyclonePlotter.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 = CyclonePlotter + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + CYCLONE_PLOTTER_INPUT_DIR = {INPUT_BASE}/met_test/tc_pairs + CYCLONE_PLOTTER_OUTPUT_DIR = {OUTPUT_BASE}/cyclone -[config] -# ================================================ -PROCESS_LIST = CyclonePlotter -## Config options below used by cyclone_plotter_wrapper module. -# ------------------------------------------------------------- -## +### +# CyclonePlotter Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#cycloneplotter +### -# -# Specify the YMD of tracks of interest -# CYCLONE_PLOTTER_INIT_DATE = 20150301 -## -# only 00, 06, 12, and 18z init times are supported in NOAA website, -# so for consistency, these are the only options for METplus. -# -CYCLONE_PLOTTER_INIT_HR = 12 ;; hh format +CYCLONE_PLOTTER_INIT_HR = 12 CYCLONE_PLOTTER_MODEL = GFSO CYCLONE_PLOTTER_PLOT_TITLE = Model Forecast Storm Tracks -## -# Indicate the region of the globe to plot -# - -# Set to Y[y]es or True to plot entire global extent. N[n]o or False -# to generate a plot of a defined region of the world, then define lons and -# lats below. -CYCLONE_PLOTTER_GLOBAL_PLOT = no - -## -# Indicate the region (i.e. define a bounding box) to plot -# -# Set to Y[y]es or True to plot entire global extent, N[n]o or False -# to generate a plot of a defined region of the world (and define lons and -# lats below). CYCLONE_PLOTTER_GLOBAL_PLOT = no -# ***IMPORTANT*** If CYCLONE_PLOTTER_GLOBAL_PLOT -# is set to False or N[n]o, then define the region of the world to plot. -# Longitudes can range from -180 to 180 degrees and latitudes from -90 to 90 degrees - -# -------------------------------- -# EXAMPLE OF BOUNDING BOX SETTINGS -# -------------------------------- -# NORTHERN HEMISPHERE CYCLONE_PLOTTER_WEST_LON = -180 CYCLONE_PLOTTER_EAST_LON = 179 CYCLONE_PLOTTER_SOUTH_LAT = 0 CYCLONE_PLOTTER_NORTH_LAT = 90 -## -# Indicate the size of symbol (point size) CYCLONE_PLOTTER_CIRCLE_MARKER_SIZE = 2 CYCLONE_PLOTTER_CROSS_MARKER_SIZE = 11 -## -# Indicate text size of annotation label CYCLONE_PLOTTER_ANNOTATION_FONT_SIZE = 3 -## -# Resolution of saved plot in dpi (dots per inch) -# Set to 0 to allow Matplotlib to determine, based on your computer CYCLONE_PLOTTER_RESOLUTION_DPI = 400 - -## -# Turn on/off the generation of an ASCII output file listing all the -# tracks that are in the plot. This can be helpful in debugging or verifying -# that what is plotted is consistent with the data. -# CYCLONE_PLOTTER_GENERATE_TRACK_ASCII = yes CYCLONE_PLOTTER_ADD_WATERMARK = False diff --git a/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat.conf b/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat.conf index 4e962a9f48..acad0c6f72 100644 --- a/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat.conf +++ b/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/EnsembleStat/EnsembleStat.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 = EnsembleStat + ### # 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 = INIT @@ -19,6 +38,7 @@ LOOP_ORDER = times ### # File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### FCST_ENSEMBLE_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst @@ -27,9 +47,6 @@ FCST_ENSEMBLE_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/arw-???-gep?/d01_{init?f #ENSEMBLE_STAT_CTRL_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst #ENSEMBLE_STAT_CTRL_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/arw-fer-gep1/d01_{init?fmt=%Y%m%d%H}_0{lead?fmt=%HH}00.grib -ENSEMBLE_STAT_N_MEMBERS = 6 - - OBS_ENSEMBLE_STAT_POINT_INPUT_DIR = {INPUT_BASE}/met_test/out/ascii2nc OBS_ENSEMBLE_STAT_POINT_INPUT_TEMPLATE = precip24_{valid?fmt=%Y%m%d%H}.nc @@ -51,6 +68,7 @@ ENSEMBLE_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H%M}/ensemble_stat ### # Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info ### MODEL = WRF @@ -91,11 +109,14 @@ ENS_VAR5_THRESH = >=5.0 ### -# EnsembleStat +# EnsembleStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#ensemblestat ### #LOG_ENSEMBLE_STAT_VERBOSITY = 2 +ENSEMBLE_STAT_N_MEMBERS = 6 + ENSEMBLE_STAT_CONFIG_FILE = {PARM_BASE}/met_config/EnsembleStatConfig_wrapped ENSEMBLE_STAT_DESC = NA diff --git a/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat_python_embedding.conf b/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat_python_embedding.conf index e540998fc4..8bdf7689cf 100644 --- a/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/EnsembleStat/EnsembleStat_python_embedding.conf @@ -1,68 +1,110 @@ -# Ensemble Stat using Python Embedding Input - [config] -## Configuration-related settings such as the process list, begin and end times, etc. +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/EnsembleStat/EnsembleStat_python_embedding.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 = EnsembleStat -# Looping by times: steps through each 'task' in the PROCESS_LIST for each -# defined time, and repeats until all times have been evaluated. -LOOP_ORDER = times -# LOOP_BY: Set to INIT to loop over initialization times -LOOP_BY = INIT +### +# 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 +### -# Format of INIT_BEG and INT_END +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run INIT_BEG=2009123112 - -# End time for METplus run INIT_END=2009123112 - -# Increment between METplus runs in seconds. Must be >= 60 INIT_INCREMENT=3600 -# List of forecast leads to process LEAD_SEQ = 24 -# Used in the MET config file for: model, output_prefix -MODEL = FCST +LOOP_ORDER = times + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +ENS_ENSEMBLE_STAT_INPUT_DATATYPE = PYTHON_NUMPY + +FCST_ENSEMBLE_STAT_INPUT_DATATYPE = PYTHON_NUMPY + +OBS_ENSEMBLE_STAT_INPUT_GRID_DATATYPE = PYTHON_NUMPY + +FCST_ENSEMBLE_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/python +FCST_ENSEMBLE_STAT_INPUT_TEMPLATE = fcst.txt, fcst.txt + +OBS_ENSEMBLE_STAT_POINT_INPUT_DIR = +OBS_ENSEMBLE_STAT_POINT_INPUT_TEMPLATE = + +OBS_ENSEMBLE_STAT_GRID_INPUT_DIR = {INPUT_BASE}/met_test/data/python +OBS_ENSEMBLE_STAT_GRID_INPUT_TEMPLATE = obs.txt + +ENSEMBLE_STAT_CLIMO_MEAN_INPUT_DIR = +ENSEMBLE_STAT_CLIMO_MEAN_INPUT_TEMPLATE = + +ENSEMBLE_STAT_CLIMO_STDEV_INPUT_DIR = +ENSEMBLE_STAT_CLIMO_STDEV_INPUT_TEMPLATE = + +ENSEMBLE_STAT_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/EnsembleStat/ens_python_embedding +ENSEMBLE_STAT_OUTPUT_TEMPLATE = -# Name to identify observation data in output +OBS_FILE_WINDOW_BEGIN = 0 +OBS_FILE_WINDOW_END = 0 + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +ENS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST +FCST_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST +OBS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG OBS + +MODEL = FCST OBTYPE = OBS -#ENSEMBLE_STAT_DESC = -# The MET ensemble_stat logging level -# 0 quiet to 5 loud, Verbosity setting for MET ensemble_stat output, 2 is default. -# This takes precendence over the general LOG_MET_VERBOSITY set in metplus_logging.conf +### +# EnsembleStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#ensemblestat +### + +ENSEMBLE_STAT_CONFIG_FILE = {PARM_BASE}/met_config/EnsembleStatConfig_wrapped + #LOG_ENSEMBLE_STAT_VERBOSITY = 2 +#ENSEMBLE_STAT_DESC = + OBS_ENSEMBLE_STAT_WINDOW_BEGIN = -5400 OBS_ENSEMBLE_STAT_WINDOW_END = 5400 -OBS_FILE_WINDOW_BEGIN = 0 -OBS_FILE_WINDOW_END = 0 - -# number of expected members for ensemble. Should correspond with the -# number of items in the list for FCST_ENSEMBLE_STAT_INPUT_TEMPLATE ENSEMBLE_STAT_N_MEMBERS = 2 -# ens.ens_thresh value in the MET config file -# threshold for ratio of valid files to expected files to allow app to run ENSEMBLE_STAT_ENS_THRESH = 1.0 - -# ens.vld_thresh value in the MET config file ENSEMBLE_STAT_ENS_VLD_THRESH = 1.0 -# Used in the MET config file for: regrid to_grid field ENSEMBLE_STAT_REGRID_TO_GRID = NONE ENSEMBLE_STAT_OUTPUT_PREFIX = PYTHON -ENSEMBLE_STAT_CONFIG_FILE = {PARM_BASE}/met_config/EnsembleStatConfig_wrapped ENSEMBLE_STAT_OUTPUT_FLAG_ECNT = BOTH ENSEMBLE_STAT_OUTPUT_FLAG_RPS = NONE @@ -87,66 +129,8 @@ ENSEMBLE_STAT_ENSEMBLE_FLAG_NMEP = FALSE ENSEMBLE_STAT_ENSEMBLE_FLAG_RANK = TRUE ENSEMBLE_STAT_ENSEMBLE_FLAG_WEIGHT = FALSE -# ENSEMBLE_STAT_MET_OBS_ERR_TABLE is not required. -# If the variable is not defined, or the value is not set -# than the MET default is used. #ENSEMBLE_STAT_MET_OBS_ERR_TABLE = -# Ensemble Variables and levels as specified in the ens field dictionary -# of the MET configuration file. Specify as ENS_VARn_NAME, ENS_VARn_LEVELS, -# (optional) ENS_VARn_OPTION -ENS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST - -# Forecast Variables and levels as specified in the fcst field dictionary -# of the MET configuration file. Specify as FCST_VARn_NAME, FCST_VARn_LEVELS, -# (optional) FCST_VARn_OPTION -FCST_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST - -# Observation Variables and levels as specified in the obs field dictionary -# of the MET configuration file. Specify as OBS_VARn_NAME, OBS_VARn_LEVELS, -# (optional) OBS_VARn_OPTION -OBS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG OBS - -ENS_ENSEMBLE_STAT_INPUT_DATATYPE = PYTHON_NUMPY - -FCST_ENSEMBLE_STAT_INPUT_DATATYPE = PYTHON_NUMPY - -OBS_ENSEMBLE_STAT_INPUT_GRID_DATATYPE = PYTHON_NUMPY - -[dir] -# Forecast model input directory for ensemble_stat -FCST_ENSEMBLE_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/python - -# Point observation input dir for ensemble_stat -OBS_ENSEMBLE_STAT_POINT_INPUT_DIR = - -# Grid observation input dir for ensemble_stat -OBS_ENSEMBLE_STAT_GRID_INPUT_DIR = {INPUT_BASE}/met_test/data/python - -# directory containing climatology mean input to EnsembleStat -# Not used in this example -ENSEMBLE_STAT_CLIMO_MEAN_INPUT_DIR = - -# directory containing climatology mean input to EnsembleStat -# Not used in this example -ENSEMBLE_STAT_CLIMO_STDEV_INPUT_DIR = - -# output directory for ensemble_stat -ENSEMBLE_STAT_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/EnsembleStat/ens_python_embedding - - -[filename_templates] - -# FCST_ENSEMBLE_STAT_INPUT_TEMPLATE - comma separated list of ensemble members -# or a single line, - wildcard characters may be used. - -# FCST_ENSEMBLE_STAT_INPUT_TEMPLATE = ????????gep?/d01_{init?fmt=%Y%m%d%H}_02400.grib -FCST_ENSEMBLE_STAT_INPUT_TEMPLATE = fcst.txt, fcst.txt - -OBS_ENSEMBLE_STAT_POINT_INPUT_TEMPLATE = - -OBS_ENSEMBLE_STAT_GRID_INPUT_TEMPLATE = obs.txt - ENSEMBLE_STAT_VERIFICATION_MASK_TEMPLATE = MET_BASE/poly/HMT_masks/huc4_1605_poly.nc, MET_BASE/poly/HMT_masks/huc4_1803_poly.nc, @@ -154,14 +138,3 @@ ENSEMBLE_STAT_VERIFICATION_MASK_TEMPLATE = MET_BASE/poly/HMT_masks/huc4_1805_poly.nc, MET_BASE/poly/HMT_masks/huc4_1806_poly.nc -# Template to look for climatology input to EnsembleStat relative to ENSEMBLE_STAT_CLIMO_MEAN_INPUT_DIR -# Not used in this example -ENSEMBLE_STAT_CLIMO_MEAN_INPUT_TEMPLATE = - -# Template to look for climatology input to EnsembleStat relative to ENSEMBLE_STAT_CLIMO_STDEV_INPUT_DIR -# Not used in this example -ENSEMBLE_STAT_CLIMO_STDEV_INPUT_TEMPLATE = - - -ENSEMBLE_STAT_OUTPUT_TEMPLATE = - diff --git a/parm/use_cases/met_tool_wrapper/Example/Example.conf b/parm/use_cases/met_tool_wrapper/Example/Example.conf index 6286e47ae5..096f7aae1f 100644 --- a/parm/use_cases/met_tool_wrapper/Example/Example.conf +++ b/parm/use_cases/met_tool_wrapper/Example/Example.conf @@ -1,61 +1,47 @@ -# Example wrapper example - [config] -# List of applications to run - only Example for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/Example/Example.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 = Example -# time looping - options are INIT, VALID, RETRO, and REALTIME +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 2017020100 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 2017020200 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 6H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 3H, 6H, 9H, 12H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} EXAMPLE_CUSTOM_LOOP_LIST = ext, nc -# End of [config] section and start of [dir] section -[dir] -# fake directory to look for input data. This can be set to anything, as it only affects the log output. -EXAMPLE_INPUT_DIR = /dir/containing/example/data +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# Fake template to use to look for input data. This template is substituted with the time information of each -# run time that is executed -EXAMPLE_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/file_{init?fmt=%Y%m%d}_{init?fmt=%H}_F{lead?fmt=%3H}.{custom?fmt=%s} \ No newline at end of file +EXAMPLE_INPUT_DIR = /dir/containing/example/data +EXAMPLE_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/file_{init?fmt=%Y%m%d}_{init?fmt=%H}_F{lead?fmt=%3H}.{custom?fmt=%s} diff --git a/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles.conf b/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles.conf index a093643520..019209b8a7 100644 --- a/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles.conf +++ b/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles.conf @@ -1,59 +1,81 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/ExtractTiles/ExtractTiles.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 = ExtractTiles -# The init time begin and end times, increment + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d INIT_BEG = 20141214 INIT_END = 20141214 - -# Increment in seconds from the begin time to the end time INIT_INCREMENT = 6H + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +EXTRACT_TILES_TC_STAT_INPUT_DIR = {INPUT_BASE}/met_test/extract_tiles +EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/filter_{init?fmt=%Y%m%d_%H}.tcst + +FCST_EXTRACT_TILES_INPUT_DIR = {INPUT_BASE}/met_test/new/reduced_model_data +FCST_EXTRACT_TILES_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/gfs_4_{init?fmt=%Y%m%d}_{init?fmt=%H}00_{lead?fmt=%HHH}.grb2 + +OBS_EXTRACT_TILES_INPUT_DIR = {INPUT_BASE}/met_test/new/reduced_model_data +OBS_EXTRACT_TILES_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/gfs_4_{valid?fmt=%Y%m%d}_{valid?fmt=%H}00_000.grb2 + +EXTRACT_TILES_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/ExtractTiles +FCST_EXTRACT_TILES_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/{storm_id}/FCST_TILE_F{lead?fmt=%3H}_gfs_4_{init?fmt=%Y%m%d}_{init?fmt=%H}00_{lead?fmt=%HHH}.nc +OBS_EXTRACT_TILES_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/{storm_id}/OBS_TILE_F{lead?fmt=%3H}_gfs_4_{valid?fmt=%Y%m%d}_{valid?fmt=%H}00_000.nc + +EXTRACT_TILES_SKIP_IF_OUTPUT_EXISTS = yes + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + FCST_VAR1_NAME = TMP FCST_VAR1_LEVELS = Z2 OBS_VAR1_NAME = TMP OBS_VAR1_LEVELS = Z2 -# Constants used in creating the tile grid + +### +# ExtractTiles Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#extracttiles +### + EXTRACT_TILES_NLAT = 60 EXTRACT_TILES_NLON = 60 -# Resolution of data in degrees EXTRACT_TILES_DLAT = 0.5 EXTRACT_TILES_DLON = 0.5 -# Degrees to subtract from the center lat and lon to -# calculate the lower left lat (lat_ll) and lower -# left lon (lon_ll) for a grid that is 2n X 2m, -# where n = EXTRACT_TILES_LAT_ADJ degrees and m = EXTRACT_TILES_LON_ADJ degrees. -# For this case, where n=15 and m=15, this results -# in a 30 deg X 30 deg grid EXTRACT_TILES_LON_ADJ = 15 EXTRACT_TILES_LAT_ADJ = 15 - -# overwrite modified track data (non-ATCF to ATCF format) if True/yes -EXTRACT_TILES_SKIP_IF_OUTPUT_EXISTS = yes - -# template of input filter tcst file created by TC-Stat -EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/filter_{init?fmt=%Y%m%d_%H}.tcst - -# templates for forecast and observation input data -FCST_EXTRACT_TILES_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/gfs_4_{init?fmt=%Y%m%d}_{init?fmt=%H}00_{lead?fmt=%HHH}.grb2 -OBS_EXTRACT_TILES_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/gfs_4_{valid?fmt=%Y%m%d}_{valid?fmt=%H}00_000.grb2 - -# templates for output data -FCST_EXTRACT_TILES_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/{storm_id}/FCST_TILE_F{lead?fmt=%3H}_gfs_4_{init?fmt=%Y%m%d}_{init?fmt=%H}00_{lead?fmt=%HHH}.nc -OBS_EXTRACT_TILES_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/{storm_id}/OBS_TILE_F{lead?fmt=%3H}_gfs_4_{valid?fmt=%Y%m%d}_{valid?fmt=%H}00_000.nc - -# directory containing input filter tcst file created by TC-Stat -EXTRACT_TILES_TC_STAT_INPUT_DIR = {INPUT_BASE}/met_test/extract_tiles - -# directory containing gridded input data (forecast and observation) -FCST_EXTRACT_TILES_INPUT_DIR = {INPUT_BASE}/met_test/new/reduced_model_data -OBS_EXTRACT_TILES_INPUT_DIR = {INPUT_BASE}/met_test/new/reduced_model_data - -# directory to write output -EXTRACT_TILES_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/ExtractTiles diff --git a/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles_mtd.conf b/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles_mtd.conf index 84e18a993a..25eeb3a2e8 100644 --- a/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles_mtd.conf +++ b/parm/use_cases/met_tool_wrapper/ExtractTiles/ExtractTiles_mtd.conf @@ -1,42 +1,43 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/ExtractTiles/ExtractTiles_mtd.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 = ExtractTiles -# The init time begin and end times, increment + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2005080700 INIT_END = 2005080700 - -# Increment in seconds from the begin time to the end time INIT_INCREMENT = 6H LEAD_SEQ = 6H -FCST_VAR1_NAME = APCP -FCST_VAR1_LEVELS = A03 - -OBS_VAR1_NAME = APCP_03 -OBS_VAR1_LEVELS = "(*,*)" - -# Constants used in creating the tile grid -EXTRACT_TILES_NLAT = 60 -EXTRACT_TILES_NLON = 60 -# Resolution of data in degrees -EXTRACT_TILES_DLAT = 0.5 -EXTRACT_TILES_DLON = 0.5 - -# Degrees to subtract from the center lat and lon to -# calculate the lower left lat (lat_ll) and lower -# left lon (lon_ll) for a grid that is 2n X 2m, -# where n = EXTRACT_TILES_LAT_ADJ degrees and m = EXTRACT_TILES_LON_ADJ degrees. -# For this case, where n=15 and m=15, this results -# in a 30 deg X 30 deg grid -EXTRACT_TILES_LON_ADJ = 15 -EXTRACT_TILES_LAT_ADJ = 15 - -EXTRACT_TILES_SKIP_IF_OUTPUT_EXISTS = no +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### EXTRACT_TILES_MTD_INPUT_DIR = {INPUT_BASE}/met_test/new/mtd EXTRACT_TILES_MTD_INPUT_TEMPLATE = mtd_WRF_APCP_vs_MC_PCP_APCP_03_A03_{valid?fmt=%Y%m%d_%H%M%S}V_2d.txt @@ -48,7 +49,35 @@ FCST_EXTRACT_TILES_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=% OBS_EXTRACT_TILES_INPUT_DIR = {INPUT_BASE}/met_test/new OBS_EXTRACT_TILES_INPUT_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}_A03h.nc - EXTRACT_TILES_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/ExtractTiles FCST_EXTRACT_TILES_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/FCST_TILE_F{lead?fmt=%3H}_wrfprs_{init?fmt=%Y%m%d}_{init?fmt=%H}00_{lead?fmt=%3H}.nc OBS_EXTRACT_TILES_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d_%H}/OBS_TILE_F{lead?fmt=%3H}_wrfprs_{valid?fmt=%Y%m%d}_{valid?fmt=%H}00_000.nc + +EXTRACT_TILES_SKIP_IF_OUTPUT_EXISTS = no + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +FCST_VAR1_NAME = APCP +FCST_VAR1_LEVELS = A03 + +OBS_VAR1_NAME = APCP_03 +OBS_VAR1_LEVELS = "(*,*)" + + +### +# ExtractTiles Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#extracttiles +### + +EXTRACT_TILES_NLAT = 60 +EXTRACT_TILES_NLON = 60 + +EXTRACT_TILES_DLAT = 0.5 +EXTRACT_TILES_DLON = 0.5 + +EXTRACT_TILES_LON_ADJ = 15 +EXTRACT_TILES_LAT_ADJ = 15 diff --git a/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_ETC.conf b/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_ETC.conf index 161ce0c198..5a99ab8dcd 100644 --- a/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_ETC.conf +++ b/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_ETC.conf @@ -1,7 +1,30 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GFDLTracker/GFDLTracker_ETC.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 = GFDLTracker + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H @@ -11,6 +34,12 @@ INIT_INCREMENT = 6H LEAD_SEQ = * + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + GFDL_TRACKER_INPUT_DIR = {INPUT_BASE}/met_test/gfdl/gfs GFDL_TRACKER_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/gfs.t{init?fmt=%H}z.pgrb2.1p00.f{lead?fmt=%3H} @@ -23,6 +52,12 @@ GFDL_TRACKER_GEN_VITALS_INPUT_TEMPLATE = genesis.vitals.gfso.glbl.{init?fmt=%Y%m GFDL_TRACKER_OUTPUT_DIR = {OUTPUT_BASE}/gfdl_tracker/etc GFDL_TRACKER_OUTPUT_TEMPLATE = gfs.{init?fmt=%Y%m%d%H}.etc.txt + +### +# GFDLTracker Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#gfdltracker +### + GFDL_TRACKER_GRIB_VERSION = 2 GFDL_TRACKER_NML_TEMPLATE_FILE = {PARM_BASE}/use_cases/met_tool_wrapper/GFDLTracker/template.nml diff --git a/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_Genesis.conf b/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_Genesis.conf index 828776f069..b0b996db71 100644 --- a/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_Genesis.conf +++ b/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_Genesis.conf @@ -1,7 +1,29 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GFDLTracker/GFDLTracker_Genesis.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 = GFDLTracker + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H @@ -11,6 +33,12 @@ INIT_INCREMENT = 6H LEAD_SEQ = * + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + GFDL_TRACKER_INPUT_DIR = {INPUT_BASE}/met_test/gfdl/gfs GFDL_TRACKER_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/gfs.t{init?fmt=%H}z.pgrb2.1p00.f{lead?fmt=%3H} @@ -23,6 +51,12 @@ GFDL_TRACKER_GEN_VITALS_INPUT_TEMPLATE = genesis.vitals.gfso.glbl.{init?fmt=%Y%m GFDL_TRACKER_OUTPUT_DIR = {OUTPUT_BASE}/gfdl_tracker/genesis GFDL_TRACKER_OUTPUT_TEMPLATE = gfs.{init?fmt=%Y%m%d%H}.genesis.txt + +### +# GFDLTracker Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#gfdltracker +### + GFDL_TRACKER_GRIB_VERSION = 2 GFDL_TRACKER_NML_TEMPLATE_FILE = {PARM_BASE}/use_cases/met_tool_wrapper/GFDLTracker/template.nml @@ -127,6 +161,5 @@ GFDL_TRACKER_USER_WANTS_TO_TRACK_THICK500850 = True GFDL_TRACKER_USER_WANTS_TO_TRACK_THICK200500 = True GFDL_TRACKER_USER_WANTS_TO_TRACK_THICK200850 = True - GFDL_TRACKER_VERBOSE_VERB = 3 GFDL_TRACKER_VERBOSE_VERB_G2 = 0 diff --git a/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_TC.conf b/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_TC.conf index 45b2b1bfb6..a76295832c 100644 --- a/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_TC.conf +++ b/parm/use_cases/met_tool_wrapper/GFDLTracker/GFDLTracker_TC.conf @@ -1,7 +1,30 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GFDLTracker/GFDLTracker_TC.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 = GFDLTracker + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H @@ -11,6 +34,12 @@ LEAD_SEQ = * #LEAD_SEQ = begin_end_incr(0, 18, 6)H #LEAD_SEQ = begin_end_incr(0, 9, 1)H, begin_end_incr(12,126,3)H + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + GFDL_TRACKER_INPUT_DIR = {INPUT_BASE}/met_test/gfdl/hwrf GFDL_TRACKER_INPUT_TEMPLATE = hwrf.25x25.EP152016.{init?fmt=%Y%m%d%H}.f{lead?fmt=%5M} @@ -20,6 +49,12 @@ GFDL_TRACKER_TC_VITALS_INPUT_TEMPLATE = tcvit_rsmc_storms.txt GFDL_TRACKER_OUTPUT_DIR = {OUTPUT_BASE}/gfdl_tracker/tc GFDL_TRACKER_OUTPUT_TEMPLATE = hwrf.{init?fmt=%Y%m%d%H}.track.txt + +### +# GFDLTracker Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#gfdltracker +### + GFDL_TRACKER_GRIB_VERSION = 1 GFDL_TRACKER_NML_TEMPLATE_FILE = {PARM_BASE}/use_cases/met_tool_wrapper/GFDLTracker/template.nml diff --git a/parm/use_cases/met_tool_wrapper/GempakToCF/GempakToCF.conf b/parm/use_cases/met_tool_wrapper/GempakToCF/GempakToCF.conf index 115089ad58..4e0591ad83 100644 --- a/parm/use_cases/met_tool_wrapper/GempakToCF/GempakToCF.conf +++ b/parm/use_cases/met_tool_wrapper/GempakToCF/GempakToCF.conf @@ -1,60 +1,50 @@ -# Gempak to NetCDF Configurations - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# List of applications to run - only GempakToCF for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GempakToCF/GempakToCF.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 = GempakToCF -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG=2017062200 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END=2017062212 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT=12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# If True, do not run GempakToCF if output file already exists -GEMPAKTOCF_SKIP_IF_OUTPUT_EXISTS = False -[dir] -# input and output data directories -GEMPAKTOCF_INPUT_DIR = {INPUT_BASE}/met_test/new/gempak -GEMPAKTOCF_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/GempakToCF +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -[filename_templates] -# format of filenames +GEMPAKTOCF_INPUT_DIR = {INPUT_BASE}/met_test/new/gempak GEMPAKTOCF_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/mrms_qpe_{valid?fmt=%Y%m%d%H}.grd + +GEMPAKTOCF_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/GempakToCF GEMPAKTOCF_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/mrms_qpe_{valid?fmt=%Y%m%d%H}.nc +GEMPAKTOCF_SKIP_IF_OUTPUT_EXISTS = False diff --git a/parm/use_cases/met_tool_wrapper/GenEnsProd/GenEnsProd.conf b/parm/use_cases/met_tool_wrapper/GenEnsProd/GenEnsProd.conf index f25bd739d7..bc11b92366 100644 --- a/parm/use_cases/met_tool_wrapper/GenEnsProd/GenEnsProd.conf +++ b/parm/use_cases/met_tool_wrapper/GenEnsProd/GenEnsProd.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GenEnsProd/GenEnsProd.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 = GenEnsProd + ### # 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 = INIT @@ -16,13 +35,13 @@ LEAD_SEQ = 24H LOOP_ORDER = processes + ### # File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### GEN_ENS_PROD_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst - -# ensemble gep4 does not exist in sample input data GEN_ENS_PROD_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/arw-fer-gep1/d01_{init?fmt=%Y%m%d%H}_{lead?fmt=%3H}00.grib, {init?fmt=%Y%m%d%H}/arw-sch-gep2/d01_{init?fmt=%Y%m%d%H}_{lead?fmt=%3H}00.grib, @@ -36,14 +55,13 @@ GEN_ENS_PROD_CTRL_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst GEN_ENS_PROD_CTRL_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/arw-fer-gep1/d01_{init?fmt=%Y%m%d%H}_{lead?fmt=%3H}00.grib -# there are 7 ensembles but 1 is used as control, so specify 6 members -GEN_ENS_PROD_N_MEMBERS = 6 - GEN_ENS_PROD_OUTPUT_DIR = {OUTPUT_BASE}/gen_ens_prod GEN_ENS_PROD_OUTPUT_TEMPLATE = gen_ens_prod_{valid?fmt=%Y%m%d_%H%M%S}V_ens.nc + ### # Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info ### ENS_VAR1_NAME = APCP @@ -68,10 +86,14 @@ ENS_VAR5_NAME = WIND ENS_VAR5_LEVELS = Z10 ENS_VAR5_THRESH = >=5.0 + ### -# GenEnsProd +# GenEnsProd Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genensprod ### +GEN_ENS_PROD_N_MEMBERS = 6 + #LOG_GEN_ENS_PROD_VERBOSITY = 2 # MODEL = WRF diff --git a/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask.conf b/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask.conf index 98d8da67d0..c601cefde1 100644 --- a/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask.conf +++ b/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask.conf @@ -1,82 +1,67 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only GenVxMask for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GenVxMask/GenVxMask.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 = GenVxMask -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG = 2012040900 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END = 2012040900 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 12H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for GenVxMask only -#LOG_GEN_VX_MASK_VERBOSITY = 1 - -GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = False - -# Time relative to valid time (in seconds if no units are specified) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. -GEN_VX_MASK_FILE_WINDOW_BEGIN = 0 -GEN_VX_MASK_FILE_WINDOW_END = 0 - -# Options to add to the gen_vx_mask command line arguments. See MET User's Guide for more information -# This can be a comma separated list of options to run GenVxMask multiple times -# The length of this list must be the same length as the GEN_VX_MASK_INPUT_MASK_TEMPLATE list -GEN_VX_MASK_OPTIONS = -type poly -# End of [config] section and start of [filename_templates] section -[filename_templates] +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Template to look for input to GenVxMask relative to GEN_VX_MASK_INPUT_DIR +GEN_VX_MASK_INPUT_DIR = GEN_VX_MASK_INPUT_TEMPLATE = {INPUT_BASE}/met_test/new/gfs/gfs_{init?fmt=%Y%m%d%H}_F{lead?fmt=%3H}.grib +GEN_VX_MASK_INPUT_MASK_DIR = GEN_VX_MASK_INPUT_MASK_TEMPLATE = {INPUT_BASE}/met_test/data/poly/CONUS.poly -# Template to use to write output from GenVxMask -# This can be a comma separated list of options to run GenVxMask multiple times -# The length of this list must be the same length as the GEN_VX_MASK_OPTIONS list +GEN_VX_MASK_OUTPUT_DIR = GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/GenVxMask/POLY_GFS_LATLON_CONUS_mask.nc -# End of [filename_templates] section and start of [dir] section -[dir] -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -GEN_VX_MASK_INPUT_DIR = +GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = False -GEN_VX_MASK_INPUT_MASK_DIR = +GEN_VX_MASK_FILE_WINDOW_BEGIN = 0 +GEN_VX_MASK_FILE_WINDOW_END = 0 -GEN_VX_MASK_OUTPUT_DIR = +### +# GenVxMask Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask +### + +#LOG_GEN_VX_MASK_VERBOSITY = 2 + +GEN_VX_MASK_OPTIONS = -type poly diff --git a/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_multiple.conf b/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_multiple.conf index 99ae17a72e..92f08c16a4 100644 --- a/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_multiple.conf +++ b/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_multiple.conf @@ -1,74 +1,66 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only GenVxMask for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GenVxMask/GenVxMask_multiple.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 = GenVxMask -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG = 2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END = 2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 24H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for GenVxMask only -#LOG_GEN_VX_MASK_VERBOSITY = 2 - -GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = False - -# Time relative to valid time (in seconds if no units are specified) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. -GEN_VX_MASK_FILE_WINDOW_BEGIN = 0 -GEN_VX_MASK_FILE_WINDOW_END = 0 - -GEN_VX_MASK_OPTIONS = -type lat -thresh 'ge30&&le50', -type lon -thresh 'le-70&&ge-130' -intersection -name lat_lon_mask -[filename_templates] +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Template to look for input to GenVxMask relative to GEN_VX_MASK_INPUT_DIR +GEN_VX_MASK_INPUT_DIR = GEN_VX_MASK_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_fcst/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%2H}.tm00_G212 +GEN_VX_MASK_INPUT_MASK_DIR = GEN_VX_MASK_INPUT_MASK_TEMPLATE = LATLON_GRID, LATLON_GRID -# Template to use to write output from GenVxMask +GEN_VX_MASK_OUTPUT_DIR = GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/GenVxMask/LAT_LON_mask.nc -[dir] +GEN_VX_MASK_FILE_WINDOW_BEGIN = 0 +GEN_VX_MASK_FILE_WINDOW_END = 0 -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -GEN_VX_MASK_INPUT_DIR = +GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = False -GEN_VX_MASK_INPUT_MASK_DIR = -GEN_VX_MASK_OUTPUT_DIR = +### +# GenVxMask Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask +### + +#LOG_GEN_VX_MASK_VERBOSITY = 2 + +GEN_VX_MASK_OPTIONS = -type lat -thresh 'ge30&&le50', -type lon -thresh 'le-70&&ge-130' -intersection -name lat_lon_mask diff --git a/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_with_arguments.conf b/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_with_arguments.conf index 3ed2658738..3c8009e848 100644 --- a/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_with_arguments.conf +++ b/parm/use_cases/met_tool_wrapper/GenVxMask/GenVxMask_with_arguments.conf @@ -1,74 +1,66 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only GenVxMask for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GenVxMask/GenVxMask_with_arguments.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 = GenVxMask -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG = 2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END = 2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 24H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for GenVxMask only -#LOG_GEN_VX_MASK_VERBOSITY = 2 - -GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = False - -# Time relative to valid time (in seconds if no units are specified) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. -GEN_VX_MASK_FILE_WINDOW_BEGIN = 0 -GEN_VX_MASK_FILE_WINDOW_END = 0 - -GEN_VX_MASK_OPTIONS = -type data -input_field 'name="APCP"; level="A{lead?fmt=%2H}";' -mask_field 'name="TMP"; level="Z2";' -thresh 'gt300' -value -9999 -name "APCP_{lead?fmt=%2H}_where_TMP_Z2_le300" -[filename_templates] +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Template to look for input to GenVxMask relative to GEN_VX_MASK_INPUT_DIR +GEN_VX_MASK_INPUT_DIR = GEN_VX_MASK_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_fcst/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%2H}.tm00_G212 +GEN_VX_MASK_INPUT_MASK_DIR = GEN_VX_MASK_INPUT_MASK_TEMPLATE = {GEN_VX_MASK_INPUT_TEMPLATE} -# Template to use to write output from GenVxMask +GEN_VX_MASK_OUTPUT_DIR = GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/GenVxMask/DATA_INPUT_FIELD_APCP_{lead?fmt=%2H}_where_TMP_Z2_le300.nc -[dir] +GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = False -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -GEN_VX_MASK_INPUT_DIR = +GEN_VX_MASK_FILE_WINDOW_BEGIN = 0 +GEN_VX_MASK_FILE_WINDOW_END = 0 -GEN_VX_MASK_INPUT_MASK_DIR = -GEN_VX_MASK_OUTPUT_DIR = +### +# GenVxMask Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask +### + +#LOG_GEN_VX_MASK_VERBOSITY = 2 + +GEN_VX_MASK_OPTIONS = -type data -input_field 'name="APCP"; level="A{lead?fmt=%2H}";' -mask_field 'name="TMP"; level="Z2";' -thresh 'gt300' -value -9999 -name "APCP_{lead?fmt=%2H}_where_TMP_Z2_le300" diff --git a/parm/use_cases/met_tool_wrapper/GridDiag/GridDiag.conf b/parm/use_cases/met_tool_wrapper/GridDiag/GridDiag.conf index 228961701f..f2d3adb84f 100644 --- a/parm/use_cases/met_tool_wrapper/GridDiag/GridDiag.conf +++ b/parm/use_cases/met_tool_wrapper/GridDiag/GridDiag.conf @@ -1,39 +1,60 @@ -# -# CONFIGURATION -# [config] -# Looping by times: steps through each 'task' in the PROCESS_LIST for each -# defined time, and repeats until all times have been evaluated. -LOOP_ORDER = processes +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GridDiag/GridDiag.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 +### -# 'Tasks' to be run PROCESS_LIST = GridDiag -LOOP_BY = INIT -# The init time begin and end times, increment, and last init hour. +### +# 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 +### + +GRID_DIAG_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID + +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2016092900 INIT_END = 2016092900 - -# This is the step-size. Increment in seconds from the begin time to the end time -# set to 6 hours = 21600 seconds INIT_INCREMENT = 21600 LEAD_SEQ = 141, 144, 147 -# frequency to run the tool -# valid options include: -# RUN_ONCE, RUN_ONCE_PER_INIT_OR_VALID, RUN_ONCE_PER_LEAD, RUN_ONCE_FOR_EACH -GRID_DIAG_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID -#LOG_GRID_DIAG_VERBOSITY = 2 +LOOP_ORDER = processes -GRID_DIAG_DESC = GFS -# Configuration file -GRID_DIAG_CONFIG_FILE = {CONFIG_DIR}/GridDiagConfig_wrapped +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +GRID_DIAG_INPUT_DIR = {INPUT_BASE}/met_test/new/model_data/grib2/gfs_fv3 +GRID_DIAG_INPUT_TEMPLATE = gfs.subset.t00z.pgrb2.0p25.f{lead?fmt=%H}, gfs.subset.t00z.pgrb2.0p25.f{lead?fmt=%H} + +GRID_DIAG_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/GridDiag +GRID_DIAG_OUTPUT_TEMPLATE = grid_diag_out.nc + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### BOTH_VAR1_NAME = APCP BOTH_VAR1_LEVELS = L0 @@ -43,10 +64,18 @@ BOTH_VAR2_NAME = PWAT BOTH_VAR2_LEVELS = L0 BOTH_VAR2_OPTIONS = n_bins = 35; range = [35, 70]; -# The following variables set values in the MET -# configuration file used by this example -# Leaving these values commented will use the value -# found in the default MET configuration file + +### +# GridDiag Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#griddiag +### + +#LOG_GRID_DIAG_VERBOSITY = 2 + +GRID_DIAG_DESC = GFS + +GRID_DIAG_CONFIG_FILE = {PARM_BASE}/met_config/GridDiagConfig_wrapped + #GRID_DIAG_REGRID_TO_GRID = NONE #GRID_DIAG_REGRID_METHOD = NEAREST #GRID_DIAG_REGRID_WIDTH = 1 @@ -54,21 +83,3 @@ BOTH_VAR2_OPTIONS = n_bins = 35; range = [35, 70]; #GRID_DIAG_REGRID_SHAPE = SQUARE GRID_DIAG_MASK_POLY = MET_BASE/poly/SAO.poly - -# -# DIRECTORIES -# -[dir] - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config - -GRID_DIAG_INPUT_DIR = {INPUT_BASE}/met_test/new/model_data/grib2/gfs_fv3 - -GRID_DIAG_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/GridDiag - -[filename_templates] - -GRID_DIAG_INPUT_TEMPLATE = gfs.subset.t00z.pgrb2.0p25.f{lead?fmt=%H}, gfs.subset.t00z.pgrb2.0p25.f{lead?fmt=%H} - -GRID_DIAG_OUTPUT_TEMPLATE = grid_diag_out.nc diff --git a/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf b/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf index 657b6f5283..0ccb837af2 100644 --- a/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf +++ b/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GridStat/GridStat.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 = GridStat + ### # 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 = INIT @@ -16,8 +35,10 @@ LEAD_SEQ = 12 LOOP_ORDER = times + ### # File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst @@ -38,11 +59,17 @@ GRID_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H} ### # Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info ### MODEL = WRF OBTYPE = MC_PCP +GRID_STAT_ONCE_PER_FIELD = False + +FCST_IS_PROB = false +#FCST_GRID_STAT_PROB_THRESH = ==0.1 + FCST_VAR1_NAME = APCP FCST_VAR1_LEVELS = A03 FCST_VAR1_THRESH = gt12.7, gt25.4, gt50.8, gt76.2 @@ -52,9 +79,9 @@ OBS_VAR1_LEVELS = "(*,*)" OBS_VAR1_THRESH = gt12.7, gt25.4, gt50.8, gt76.2 - ### -# GridStat +# GridStat Settings (optional) +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#gridstat ### #LOG_GRID_STAT_VERBOSITY = 2 @@ -91,16 +118,6 @@ GRID_STAT_NEIGHBORHOOD_SHAPE = SQUARE GRID_STAT_NEIGHBORHOOD_COV_THRESH = >=0.5 -GRID_STAT_ONCE_PER_FIELD = False - -FCST_IS_PROB = false - -FCST_GRID_STAT_PROB_THRESH = ==0.1 - -OBS_IS_PROB = false - -OBS_GRID_STAT_PROB_THRESH = ==0.1 - GRID_STAT_OUTPUT_PREFIX = {MODEL}_{CURRENT_FCST_NAME}_vs_{OBTYPE}_{CURRENT_OBS_NAME} #GRID_STAT_CLIMO_MEAN_FILE_NAME = diff --git a/parm/use_cases/met_tool_wrapper/GridStat/GridStat_forecast.conf b/parm/use_cases/met_tool_wrapper/GridStat/GridStat_forecast.conf index 2ec6d04393..f67e2ac32e 100644 --- a/parm/use_cases/met_tool_wrapper/GridStat/GridStat_forecast.conf +++ b/parm/use_cases/met_tool_wrapper/GridStat/GridStat_forecast.conf @@ -1,46 +1,32 @@ -# GridStat Forecast Configuration - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# Name to identify model (forecast) data in output -MODEL = WRF +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GridStat/GridStat_multiple_config_files.html -# List of variables to compare in GridStat - FCST_VAR1 variables correspond -# to OBS_VAR1 variables -# Note [FCST/OBS/BOTH]_GRID_STAT_VAR_NAME can be used instead if different evaluations -# are needed for different tools +# For additional information, please see the METplus Users Guide. +# https://metplus.readthedocs.io/en/latest/Users_Guide -# Name of forecast variable 1 -FCST_VAR1_NAME = APCP +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# List of levels to evaluate for forecast variable 1 -# A03 = 3 hour accumulation in GRIB file -FCST_VAR1_LEVELS = A03 +FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst +FCST_GRID_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +MODEL = WRF -# List of thresholds to evaluate for each name/level combination for -# both forecast and observation variable 1 +FCST_VAR1_NAME = APCP +FCST_VAR1_LEVELS = A03 FCST_VAR1_THRESH = gt12.7, gt25.4, gt50.8, gt76.2 -# Time relative to valid time (in seconds) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. FCST_GRID_STAT_FILE_WINDOW_BEGIN = 0 FCST_GRID_STAT_FILE_WINDOW_END = 0 -# Set to true if forecast data is probabilistic FCST_IS_PROB = false - -# End of [config] section and start of [dir] section -[dir] - -# directory containing forecast input to GridStat -FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst - - -# End of [dir] section and start of [filename_templates] section -[filename_templates] - -# Template to look for forecast input to GridStat relative to FCST_GRID_STAT_INPUT_DIR -FCST_GRID_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 diff --git a/parm/use_cases/met_tool_wrapper/GridStat/GridStat_observation.conf b/parm/use_cases/met_tool_wrapper/GridStat/GridStat_observation.conf index 1818444a49..c0f7bc6469 100644 --- a/parm/use_cases/met_tool_wrapper/GridStat/GridStat_observation.conf +++ b/parm/use_cases/met_tool_wrapper/GridStat/GridStat_observation.conf @@ -1,44 +1,32 @@ -# GridStat Observation Configuration - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# Name to identify observation data in output -OBTYPE = MC_PCP +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GridStat/GridStat_multiple_config_files.html -# Name of observation variable 1 -OBS_VAR1_NAME = APCP_03 +# For additional information, please see the METplus Users Guide. +# https://metplus.readthedocs.io/en/latest/Users_Guide -# List of levels to evaluate for observation variable 1 -# (*,*) is NetCDF notation - must include quotes around these values! -# must be the same length as FCST_VAR1_LEVELS -OBS_VAR1_LEVELS = "(*,*)" +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# List of thresholds to evaluate for each name/level combination for -# both forecast and observation variable 1 -OBS_VAR1_THRESH = gt12.7, gt25.4, gt50.8, gt76.2 +OBS_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new +OBS_GRID_STAT_INPUT_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}_A03h.nc -# Time relative to valid time (in seconds) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. OBS_GRID_STAT_FILE_WINDOW_BEGIN = 0 OBS_GRID_STAT_FILE_WINDOW_END = 0 -# Set to true if observation data is probabilistic -# Only used if configuring forecast data as the 'OBS' input -OBS_IS_PROB = false - -# End of [config] section and start of [dir] section -[dir] - -# directory containing observation input to GridStat -OBS_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### +OBTYPE = MC_PCP -# End of [dir] section and start of [filename_templates] section -[filename_templates] +OBS_VAR1_NAME = APCP_03 +OBS_VAR1_LEVELS = "(*,*)" +OBS_VAR1_THRESH = gt12.7, gt25.4, gt50.8, gt76.2 -# Template to look for observation input to GridStat relative to OBS_GRID_STAT_INPUT_DIR -OBS_GRID_STAT_INPUT_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}_A03h.nc +OBS_IS_PROB = false diff --git a/parm/use_cases/met_tool_wrapper/GridStat/GridStat_python_embedding.conf b/parm/use_cases/met_tool_wrapper/GridStat/GridStat_python_embedding.conf index 156d0509f7..46a2354fae 100644 --- a/parm/use_cases/met_tool_wrapper/GridStat/GridStat_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/GridStat/GridStat_python_embedding.conf @@ -1,117 +1,103 @@ -# GridStat METplus Configuration - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# List of applications to run - only GridStat for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/GridStat/GridStat_python_embedding.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 = GridStat -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 12 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for GridStat only -#LOG_GRID_STAT_VERBOSITY = 2 -# Location of MET config file to pass to GridStat -GRID_STAT_CONFIG_FILE = {PARM_BASE}/met_config/GridStatConfig_wrapped +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# grid to remap data. Value is set as the 'to_grid' variable in the 'regrid' dictionary -# See MET User's Guide for more information -GRID_STAT_REGRID_TO_GRID = G130 -# Name to identify model (forecast) data in output -MODEL = FCST +FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst +FCST_GRID_STAT_INPUT_TEMPLATE = PYTHON_NUMPY -# Name to identify observation data in output -OBTYPE = OBS +OBS_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new +OBS_GRID_STAT_INPUT_TEMPLATE = PYTHON_NUMPY -# set the desc value in the GridStat MET config file -GRID_STAT_DESC = NA -# List of variables to compare in GridStat - FCST_VAR1 variables correspond -# to OBS_VAR1 variables -# Note [FCST/OBS/BOTH]_GRID_STAT_VAR_NAME can be used instead if different evaluations -# are needed for different tools +GRID_STAT_CLIMO_MEAN_INPUT_DIR = +GRID_STAT_CLIMO_MEAN_INPUT_TEMPLATE = -# Name of forecast variable 1 -FCST_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST +GRID_STAT_CLIMO_STDEV_INPUT_DIR = +GRID_STAT_CLIMO_STDEV_INPUT_TEMPLATE = -# Name of observation variable 1 -OBS_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS +GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/GridStat_python_embedding +GRID_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H} -# Time relative to valid time (in seconds) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. FCST_GRID_STAT_FILE_WINDOW_BEGIN = 0 FCST_GRID_STAT_FILE_WINDOW_END = 0 OBS_GRID_STAT_FILE_WINDOW_BEGIN = 0 OBS_GRID_STAT_FILE_WINDOW_END = 0 -# MET GridStat neighborhood values -# See the MET User's Guide GridStat section for more information -# width value passed to nbrhd dictionary in the MET config file -GRID_STAT_NEIGHBORHOOD_WIDTH = 1 +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# shape value passed to nbrhd dictionary in the MET config file -GRID_STAT_NEIGHBORHOOD_SHAPE = SQUARE +MODEL = FCST +OBTYPE = OBS -# cov thresh list passed to nbrhd dictionary in the MET config file -GRID_STAT_NEIGHBORHOOD_COV_THRESH = >=0.5 +FCST_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST +FCST_IS_PROB = false +FCST_GRID_STAT_PROB_THRESH = ==0.1 + +OBS_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS -# Set to true to run GridStat separately for each field specified -# Set to false to create one run of GridStat per run time that -# includes all fields specified. GRID_STAT_ONCE_PER_FIELD = False -# Set to true if forecast data is probabilistic -FCST_IS_PROB = false -# Only used if FCST_IS_PROB is true - sets probabilistic threshold -FCST_GRID_STAT_PROB_THRESH = ==0.1 +### +# GridStat Settings (optional) +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#gridstat +### + +#LOG_GRID_STAT_VERBOSITY = 2 + +GRID_STAT_CONFIG_FILE = {PARM_BASE}/met_config/GridStatConfig_wrapped -# Set to true if observation data is probabilistic -# Only used if configuring forecast data as the 'OBS' input -OBS_IS_PROB = false +GRID_STAT_REGRID_TO_GRID = G130 -# Only used if OBS_IS_PROB is true - sets probabilistic threshold -OBS_GRID_STAT_PROB_THRESH = ==0.1 +GRID_STAT_DESC = NA + +GRID_STAT_NEIGHBORHOOD_WIDTH = 1 +GRID_STAT_NEIGHBORHOOD_SHAPE = SQUARE + +GRID_STAT_NEIGHBORHOOD_COV_THRESH = >=0.5 GRID_STAT_OUTPUT_PREFIX = {MODEL}_vs_{OBTYPE} @@ -126,48 +112,4 @@ GRID_STAT_NC_PAIRS_FLAG_DIFF = FALSE GRID_STAT_NC_PAIRS_FLAG_CLIMO = FALSE GRID_STAT_NC_PAIRS_FLAG_APPLY_MASK = FALSE - -# End of [config] section and start of [dir] section -[dir] - -# directory containing forecast input to GridStat -FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst - -# directory containing observation input to GridStat -OBS_GRID_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new - -# directory containing climatology mean input to GridStat -# Not used in this example -GRID_STAT_CLIMO_MEAN_INPUT_DIR = - -# directory containing climatology mean input to GridStat -# Not used in this example -GRID_STAT_CLIMO_STDEV_INPUT_DIR = - -# directory to write output from GridStat -GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/GridStat_python_embedding - -# End of [dir] section and start of [filename_templates] section -[filename_templates] - -# Template to look for forecast input to GridStat relative to FCST_GRID_STAT_INPUT_DIR -FCST_GRID_STAT_INPUT_TEMPLATE = PYTHON_NUMPY - -# Template to look for observation input to GridStat relative to OBS_GRID_STAT_INPUT_DIR -OBS_GRID_STAT_INPUT_TEMPLATE = PYTHON_NUMPY - - -# Optional subdirectories relative to GRID_STAT_OUTPUT_DIR to write output from GridStat -GRID_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H} - -# Template to look for climatology input to GridStat relative to GRID_STAT_CLIMO_MEAN_INPUT_DIR -# Not used in this example -GRID_STAT_CLIMO_MEAN_INPUT_TEMPLATE = - -# Template to look for climatology input to GridStat relative to GRID_STAT_CLIMO_STDEV_INPUT_DIR -# Not used in this example -GRID_STAT_CLIMO_STDEV_INPUT_TEMPLATE = - -# Used to specify one or more verification mask files for GridStat -# Not used for this example GRID_STAT_VERIFICATION_MASK_TEMPLATE = diff --git a/parm/use_cases/met_tool_wrapper/IODA2NC/IODA2NC.conf b/parm/use_cases/met_tool_wrapper/IODA2NC/IODA2NC.conf index 2d184ac189..0948944a55 100644 --- a/parm/use_cases/met_tool_wrapper/IODA2NC/IODA2NC.conf +++ b/parm/use_cases/met_tool_wrapper/IODA2NC/IODA2NC.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/IODA2NC/IODA2NC.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 = IODA2NC + ### # 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 @@ -12,8 +31,10 @@ VALID_BEG = 2020031012 VALID_END = 2020031012 VALID_INCREMENT = 6H + ### -# File I/O Info +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### IODA2NC_INPUT_DIR = {INPUT_BASE}/met_test/new/ioda @@ -23,21 +44,15 @@ IODA2NC_OUTPUT_DIR = {OUTPUT_BASE}/ioda2nc IODA2NC_OUTPUT_TEMPLATE = ioda.NC001007.{valid?fmt=%Y%m%d%H}.summary.nc -# OPTIONAL CONFIGURATIONS - ### -# ioda2nc command line arguments +# IODA2NC Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#ioda2nc ### #IODA2NC_VALID_BEG = {valid?fmt=%Y%m%d_%H?shift=-24H} #IODA2NC_VALID_END = {valid?fmt=%Y%m%d_%H} #IODA2NC_NMSG = 10 - -### -# ioda2nc configuration variables -### - #IODA2NC_MESSAGE_TYPE = #IODA2NC_MESSAGE_TYPE_MAP = diff --git a/parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoad.conf b/parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoad.conf index 7aa355faea..1ddcb184ae 100644 --- a/parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoad.conf +++ b/parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoad.conf @@ -1,9 +1,32 @@ [config] -# METdbLoad example +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/METdbLoad/METdbLoad.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 = METDbLoad + +### +# 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 +### + +MET_DB_LOAD_RUNTIME_FREQ = RUN_ONCE + LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H @@ -13,23 +36,31 @@ VALID_INCREMENT = 12H LOOP_ORDER = processes -MET_DB_LOAD_RUNTIME_FREQ = RUN_ONCE -MET_DATA_DB_DIR = {METPLUS_BASE}/../METdatadb +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +MET_DB_LOAD_INPUT_TEMPLATE = {INPUT_BASE}/met_test/out/grid_stat + + +### +# METdbLoad Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#metdbload +### + +MET_DATA_DB_DIR = {METPLUS_BASE}/../METdataio MET_DB_LOAD_XML_FILE = {PARM_BASE}/use_cases/met_tool_wrapper/METdbLoad/METdbLoadConfig.xml -# If true, remove temporary XML with values substituted from XML_FILE -# Set to false for debugging purposes MET_DB_LOAD_REMOVE_TMP_XML = True -# connection info MET_DB_LOAD_MV_HOST = localhost:3306 MET_DB_LOAD_MV_DATABASE = mv_metplus_test MET_DB_LOAD_MV_USER = root MET_DB_LOAD_MV_PASSWORD = mvuser -# data info MET_DB_LOAD_MV_VERBOSE = false MET_DB_LOAD_MV_INSERT_SIZE = 1 MET_DB_LOAD_MV_MODE_HEADER_DB_CHECK = false @@ -40,5 +71,3 @@ MET_DB_LOAD_MV_LOAD_STAT = true MET_DB_LOAD_MV_LOAD_MODE = false MET_DB_LOAD_MV_LOAD_MTD = false MET_DB_LOAD_MV_LOAD_MPR = false - -MET_DB_LOAD_INPUT_TEMPLATE = {INPUT_BASE}/met_test/out/grid_stat diff --git a/parm/use_cases/met_tool_wrapper/MODE/MODE.conf b/parm/use_cases/met_tool_wrapper/MODE/MODE.conf index fa243f518e..7d094f1f0c 100644 --- a/parm/use_cases/met_tool_wrapper/MODE/MODE.conf +++ b/parm/use_cases/met_tool_wrapper/MODE/MODE.conf @@ -1,10 +1,31 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/MODE/MODE.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 = MODE -LOOP_ORDER = times -LOOP_BY = INIT +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG=2005080700 INIT_END=2005080700 @@ -12,7 +33,13 @@ INIT_INCREMENT = 12H LEAD_SEQ = 12 -#LOG_MODE_VERBOSITY = 2 +LOOP_ORDER = times + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### FCST_MODE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst FCST_MODE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 @@ -23,38 +50,33 @@ OBS_MODE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d%H}/wrfprs_ruc13_00.tm00_G212 MODE_OUTPUT_DIR = {OUTPUT_BASE}/mode MODE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d%H} +FCST_MODE_FILE_WINDOW_BEGIN = 0 +FCST_MODE_FILE_WINDOW_END = 0 -MODEL = WRF - -MODE_DESC = NA - -OBTYPE = WRF - -MODE_CONFIG_FILE = {PARM_BASE}/met_config/MODEConfig_wrapped +OBS_MODE_FILE_WINDOW_BEGIN = 0 +OBS_MODE_FILE_WINDOW_END = 0 +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -#MODE_FCST_FILE_TYPE = +FCST_IS_PROB = false FCST_VAR1_NAME = RH FCST_VAR1_LEVELS = P500 -#MODE_MULTIVAR_LOGIC = - FCST_MODE_CONV_RADIUS = 5 FCST_MODE_CONV_THRESH = >=80.0 FCST_MODE_MERGE_THRESH = >=75.0 FCST_MODE_MERGE_FLAG = NONE - +#MODE_FCST_FILE_TYPE = #MODE_FCST_FILTER_ATTR_NAME = #MODE_FCST_FILTER_ATTR_THRESH = #MODE_FCST_CENSOR_THRESH = #MODE_FCST_CENSOR_VAL = #MODE_FCST_VLD_THRESH = -FCST_IS_PROB = false - - -#MODE_OBS_FILE_TYPE = OBS_VAR1_NAME = RH OBS_VAR1_LEVELS = P500 @@ -64,19 +86,31 @@ OBS_MODE_CONV_THRESH = >=80.0 OBS_MODE_MERGE_THRESH = >=75.0 OBS_MODE_MERGE_FLAG = NONE +#MODE_OBS_FILE_TYPE = + #MODE_OBS_FILTER_ATTR_NAME = #MODE_OBS_FILTER_ATTR_THRESH = #MODE_OBS_CENSOR_THRESH = #MODE_OBS_CENSOR_VAL = #MODE_OBS_VLD_THRESH = -OBS_IS_PROB = false +### +# MODE Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#mode +### -FCST_MODE_FILE_WINDOW_BEGIN = 0 -FCST_MODE_FILE_WINDOW_END = 0 -OBS_MODE_FILE_WINDOW_BEGIN = 0 -OBS_MODE_FILE_WINDOW_END = 0 +#LOG_MODE_VERBOSITY = 2 + +MODEL = WRF + +MODE_DESC = NA + +OBTYPE = WRF + +MODE_CONFIG_FILE = {PARM_BASE}/met_config/MODEConfig_wrapped + +#MODE_MULTIVAR_LOGIC = MODE_REGRID_TO_GRID = NONE #MODE_REGRID_METHOD = diff --git a/parm/use_cases/met_tool_wrapper/MODE/MODE_python_embedding.conf b/parm/use_cases/met_tool_wrapper/MODE/MODE_python_embedding.conf index a9a5cb45a2..84cc1e417a 100644 --- a/parm/use_cases/met_tool_wrapper/MODE/MODE_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/MODE/MODE_python_embedding.conf @@ -1,161 +1,107 @@ -# MODE METplus Configuration - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# List of applications to run - only MODE for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/MODE/MODE_python_embedding.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 = MODE -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INIT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 12 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for MODE only -#LOG_MODE_VERBOSITY = 2 -# Location of MET config file to pass to the MODE -# References CONFIG_DIR from the [dir] section -MODE_CONFIG_FILE = {CONFIG_DIR}/MODEConfig_wrapped +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# grid to remap data. Value is set as the 'to_grid' variable in the 'regrid' dictionary -# See MET User's Guide for more information -MODE_REGRID_TO_GRID = NONE +FCST_MODE_INPUT_DIR = +FCST_MODE_INPUT_TEMPLATE = PYTHON_NUMPY -MODE_MASK_MISSING_FLAG = BOTH +OBS_MODE_INPUT_DIR = +OBS_MODE_INPUT_TEMPLATE = PYTHON_NUMPY -MODE_OUTPUT_PREFIX = FCST_vs_OBS +MODE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/MODE_python_embedding +MODE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d%H} -# Location of merge config file to pass to the MODE -# References CONFIG_DIR from the [dir] section -# Not used if unset or set to an empty string -MODE_MERGE_CONFIG_FILE = +FCST_MODE_FILE_WINDOW_BEGIN = 0 +FCST_MODE_FILE_WINDOW_END = 0 +OBS_MODE_FILE_WINDOW_BEGIN = 0 +OBS_MODE_FILE_WINDOW_END = 0 -# Name to identify model (forecast) data in output -MODEL = WRF -# Name to identify observation data in output -OBTYPE = WRF +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -#MODE_GRID_RES = 4 +FCST_IS_PROB = false -# turn on quilting -MODE_QUILT = True +FCST_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST -# convolution radius list FCST_MODE_CONV_RADIUS = 5 - -# convolution radius list -OBS_MODE_CONV_RADIUS = 5 - -# convolution threshold list FCST_MODE_CONV_THRESH = >=80.0 - -# convolution threshold list -OBS_MODE_CONV_THRESH = >=80.0 - -# merge threshold list FCST_MODE_MERGE_THRESH = >=75.0 - -# merge threshold list -OBS_MODE_MERGE_THRESH = >=75.0 - -# merge flag: options are NONE, THRESH, ENGINE, or BOTH FCST_MODE_MERGE_FLAG = NONE -# merge flag: options are NONE, THRESH, ENGINE, or BOTH -OBS_MODE_MERGE_FLAG = NONE - -# List of variables to compare in MODE - FCST_VAR1 variables correspond -# to OBS_VAR1 variables - -# Name of forecast variable 1 -FCST_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST - -# Name of observation variable 1 OBS_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS - -# List of levels to evaluate for observation variable 1 -# P500 = 500 mb pressure level in GRIB file -# must be the same length as FCST_VAR1_LEVELS OBS_VAR1_LEVELS = P500 -# Time relative to valid time (in seconds) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. -FCST_MODE_FILE_WINDOW_BEGIN = 0 -FCST_MODE_FILE_WINDOW_END = 0 -OBS_MODE_FILE_WINDOW_BEGIN = 0 -OBS_MODE_FILE_WINDOW_END = 0 +OBS_MODE_CONV_THRESH = >=80.0 +OBS_MODE_CONV_RADIUS = 5 +OBS_MODE_MERGE_THRESH = >=75.0 +OBS_MODE_MERGE_FLAG = NONE -# Set to true if forecast data is probabilistic -FCST_IS_PROB = false -# Set to true if observation data is probabilistic -# Only used if configuring forecast data as the 'OBS' input -OBS_IS_PROB = false +### +# MODE Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#mode +### -# End of [config] section and start of [dir] section -[dir] +#LOG_MODE_VERBOSITY = 2 -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config +MODE_CONFIG_FILE = {PARM_BASE}/met_config/MODEConfig_wrapped -# directory containing forecast input to MODE -FCST_MODE_INPUT_DIR = +MODE_REGRID_TO_GRID = NONE -# directory containing observation input to MODE -OBS_MODE_INPUT_DIR = +MODE_MASK_MISSING_FLAG = BOTH -# directory to write output from MODE -MODE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/MODE_python_embedding +MODE_OUTPUT_PREFIX = FCST_vs_OBS -# End of [dir] section and start of [filename_templates] section -[filename_templates] +MODE_MERGE_CONFIG_FILE = -# Template to look for forecast input to MODE relative to FCST_MODE_INPUT_DIR -FCST_MODE_INPUT_TEMPLATE = PYTHON_NUMPY +MODEL = WRF -# Template to look for observation input to MODE relative to OBS_MODE_INPUT_DIR -OBS_MODE_INPUT_TEMPLATE = PYTHON_NUMPY +OBTYPE = WRF -# Optional subdirectories relative to MODE_OUTPUT_DIR to write output from MODE -MODE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d%H} +#MODE_GRID_RES = 4 + +MODE_QUILT = True -# Used to specify a verification mask file for MODE -# Not used for this example. MODE_VERIFICATION_MASK_TEMPLATE = diff --git a/parm/use_cases/met_tool_wrapper/MTD/MTD.conf b/parm/use_cases/met_tool_wrapper/MTD/MTD.conf index 6aaec82872..8098d9c82f 100644 --- a/parm/use_cases/met_tool_wrapper/MTD/MTD.conf +++ b/parm/use_cases/met_tool_wrapper/MTD/MTD.conf @@ -1,122 +1,95 @@ -# MTD (MODE Time Domain) METplus Configuration - [config] -# List of applications to run - only MTD for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/MTD/MTD.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 = MTD -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT=1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 6H, 9H, 12H - -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# if true, only process a single data set with MTD -MTD_SINGLE_RUN = False -# Data to process in single mode -# FCST and OBS are valid options -MTD_SINGLE_DATA_SRC = OBS +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# forecast convolution radius list -FCST_MTD_CONV_RADIUS = 10 +FCST_MTD_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst +FCST_MTD_INPUT_TEMPLATE= {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 -# forecast convolution threshold list -FCST_MTD_CONV_THRESH = >=0.0 +OBS_MTD_INPUT_DIR = {INPUT_BASE}/met_test/new +OBS_MTD_INPUT_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}_A03h.nc -# observation convolution radius list -OBS_MTD_CONV_RADIUS = 10 +MTD_OUTPUT_DIR = {OUTPUT_BASE}/mtd +MTD_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d%H} -# observation convolution threshold list -OBS_MTD_CONV_THRESH = >=0.0 -# list of variables to compare +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +FCST_IS_PROB = False +FCST_PROB_IN_GRIB_PDS = false + FCST_VAR1_NAME = APCP FCST_VAR1_LEVELS = A03 FCST_VAR1_THRESH = gt12.7 +FCST_MTD_CONV_RADIUS = 10 +FCST_MTD_CONV_THRESH = >=0.0 + OBS_VAR1_NAME = APCP_03 OBS_VAR1_LEVELS = "(*,*)" OBS_VAR1_THRESH = gt12.7 -# description of data to be processed -# used in output file path +OBS_MTD_CONV_RADIUS = 10 +OBS_MTD_CONV_THRESH = >=0.0 + + +### +# MTD Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#mtd +### + +MTD_SINGLE_RUN = False +MTD_SINGLE_DATA_SRC = OBS + MODEL = WRF MTD_DESC = NA OBTYPE = MC_PCP -# location of MODE Time Domain MET config file -# References CONFIG_DIR from the [dir] section -MTD_CONFIG_FILE = {CONFIG_DIR}/MTDConfig_wrapped +MTD_CONFIG_FILE = {PARM_BASE}/met_config/MTDConfig_wrapped -# grid to remap data. Value is set as the 'to_grid' variable in the 'regrid' dictionary -# See MET User's Guide for more information MTD_REGRID_TO_GRID = OBS -# Minimum volume MTD_MIN_VOLUME = 2000 -# output prefix to add to output filenames MTD_OUTPUT_PREFIX = {MODEL}_{CURRENT_FCST_NAME}_vs_{OBTYPE}_{CURRENT_OBS_NAME}_{CURRENT_FCST_LEVEL} - -# set to True if forecast data is probabilistic -FCST_IS_PROB = False - -# True if probabilistic information is in the GRIB Product Definition Section -FCST_PROB_IN_GRIB_PDS = false - - -# End of [config] section and start of [dir] section -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config - -# input and output data directories for each application in PROCESS_LIST -FCST_MTD_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst - -OBS_MTD_INPUT_DIR = {INPUT_BASE}/met_test/new - -MTD_OUTPUT_DIR = {OUTPUT_BASE}/mtd - -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# format of filenames - -FCST_MTD_INPUT_TEMPLATE= {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 - -OBS_MTD_INPUT_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}_A03h.nc - -MTD_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d%H} \ No newline at end of file diff --git a/parm/use_cases/met_tool_wrapper/MTD/MTD_python_embedding.conf b/parm/use_cases/met_tool_wrapper/MTD/MTD_python_embedding.conf index eb0cc3baa2..bf0d0c4d90 100644 --- a/parm/use_cases/met_tool_wrapper/MTD/MTD_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/MTD/MTD_python_embedding.conf @@ -1,129 +1,95 @@ -# MTD (MODE Time Domain) using Python Embedding METplus Configuration - [config] -# List of applications to run - only MTD for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/MTD/MTD_python_embedding.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 = MTD -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT=1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0, 1, 2 - -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# if true, only process a single data set with MTD -MTD_SINGLE_RUN = False - -# Data to process in single mode -# FCST and OBS are valid options -MTD_SINGLE_DATA_SRC = OBS - -# forecast convolution radius list -FCST_MTD_CONV_RADIUS = 0 -# forecast convolution threshold list -FCST_MTD_CONV_THRESH = >=10 - -# observation convolution radius list -OBS_MTD_CONV_RADIUS = 15 - -# observation convolution threshold list -OBS_MTD_CONV_THRESH = >=1.0 - -# list of variables to compare -FCST_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST - -OBS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG OBS - -FCST_MTD_INPUT_DATATYPE = PYTHON_NUMPY - -OBS_MTD_INPUT_DATATYPE = PYTHON_NUMPY +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### +FCST_MTD_INPUT_DIR = {INPUT_BASE}/met_test/data/python +FCST_MTD_INPUT_TEMPLATE= fcst.txt -# description of data to be processed -# used in output file path -MODEL = FCST -OBTYPE = OBS +OBS_MTD_INPUT_DIR = {INPUT_BASE}/met_test/data/python +OBS_MTD_INPUT_TEMPLATE = obs.txt -#MTD_DESC = +MTD_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/MTD/mtd_python_embedding +MTD_OUTPUT_TEMPLATE = -# location of MODE Time Domain MET config file -# References CONFIG_DIR from the [dir] section -MTD_CONFIG_FILE = {CONFIG_DIR}/MTDConfig_wrapped -# grid to remap data. Value is set as the 'to_grid' variable in the 'regrid' dictionary -# See MET User's Guide for more information -MTD_REGRID_TO_GRID = OBS +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# Minimum volume -FCST_MTD_MIN_VOLUME = 2000 +FCST_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST -# convolution radius for forecast data FCST_MTD_CONV_RADIUS = 15 - -# convolution threshold for forecast data FCST_MTD_CONV_THRESH = >=5.0 +FCST_MTD_MIN_VOLUME = 2000 -# output prefix to add to output filenames -MTD_OUTPUT_PREFIX = PYTHON +FCST_MTD_INPUT_DATATYPE = PYTHON_NUMPY -# set to True if forecast data is probabilistic FCST_IS_PROB = false - -# True if probabilistic information is in the GRIB Product Definition Section FCST_PROB_IN_GRIB_PDS = false -# End of [config] section and start of [dir] section -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config +OBS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG OBS -# input and output data directories for each application in PROCESS_LIST -FCST_MTD_INPUT_DIR = {INPUT_BASE}/met_test/data/python +OBS_MTD_CONV_RADIUS = 15 +OBS_MTD_CONV_THRESH = >=1.0 -OBS_MTD_INPUT_DIR = {INPUT_BASE}/met_test/data/python +OBS_MTD_INPUT_DATATYPE = PYTHON_NUMPY -MTD_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/MTD/mtd_python_embedding -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# format of filenames +### +# MTD Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#mtd +### -FCST_MTD_INPUT_TEMPLATE= fcst.txt +MTD_SINGLE_RUN = False +MTD_SINGLE_DATA_SRC = OBS -OBS_MTD_INPUT_TEMPLATE = obs.txt +MTD_CONFIG_FILE = {PARM_BASE}/met_config/MTDConfig_wrapped -MTD_OUTPUT_TEMPLATE = \ No newline at end of file +MODEL = FCST +OBTYPE = OBS + +#MTD_DESC = + +MTD_REGRID_TO_GRID = OBS + +MTD_OUTPUT_PREFIX = PYTHON diff --git a/parm/use_cases/met_tool_wrapper/PB2NC/PB2NC.conf b/parm/use_cases/met_tool_wrapper/PB2NC/PB2NC.conf index a10a30caee..93651289ea 100644 --- a/parm/use_cases/met_tool_wrapper/PB2NC/PB2NC.conf +++ b/parm/use_cases/met_tool_wrapper/PB2NC/PB2NC.conf @@ -1,7 +1,30 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PB2NC/PB2NC.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 = PB2NC + +### +# 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 VALID_BEG = 2007033112 @@ -10,17 +33,28 @@ VALID_INCREMENT = 1M LEAD_SEQ = 0 -PB2NC_OFFSETS = 12 -PB2NC_SKIP_IF_OUTPUT_EXISTS = True +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### PB2NC_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_obs/prepbufr PB2NC_INPUT_TEMPLATE = ndas.t{da_init?fmt=%H}z.prepbufr.tm{offset?fmt=%2H}.{da_init?fmt=%Y%m%d}.nr +PB2NC_OFFSETS = 12 + +PB2NC_SKIP_IF_OUTPUT_EXISTS = True + PB2NC_OUTPUT_DIR = {OUTPUT_BASE}/pb2nc PB2NC_OUTPUT_TEMPLATE = sample_pb.nc +### +# PB2NC Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pb2nc +### + PB2NC_CONFIG_FILE = {PARM_BASE}/met_config/PB2NCConfig_wrapped PB2NC_OBS_WINDOW_BEGIN = -1800 diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_add.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_add.conf index e9fb5e284c..48126f344b 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_add.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_add.conf @@ -1,7 +1,30 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_add.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 = PCPCombine + +### +# 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 = 201908021815 @@ -12,6 +35,14 @@ LEAD_SEQ = 15M LOOP_ORDER = times + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +FCST_PCP_COMBINE_RUN = True + FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/new FCST_PCP_COMBINE_INPUT_TEMPLATE = NEWSe_{init?fmt=%Y%m%d}_i{init?fmt=%H%M}_m0_f{valid?fmt=%H%M}.nc @@ -19,9 +50,13 @@ FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombi FCST_PCP_COMBINE_OUTPUT_TEMPLATE = NEWSe5min_mem00_lag00.nc +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + #LOG_PCP_COMBINE_VERBOSITY = 2 -FCST_PCP_COMBINE_RUN = True FCST_PCP_COMBINE_METHOD = ADD FCST_PCP_COMBINE_MAX_FORECAST = 2d diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_bucket.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_bucket.conf index 614adf6179..ded9c6cd02 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_bucket.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_bucket.conf @@ -1,7 +1,30 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_bucket.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 = PcpCombine + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2012040900 @@ -12,8 +35,13 @@ LEAD_SEQ = 15H LOOP_ORDER = times + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + FCST_PCP_COMBINE_RUN = True -FCST_PCP_COMBINE_METHOD = ADD FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/new/gfs FCST_PCP_COMBINE_INPUT_TEMPLATE = gfs_{init?fmt=%Y%m%d%H}_F{lead?fmt=%3H}.grib @@ -21,6 +49,14 @@ FCST_PCP_COMBINE_INPUT_TEMPLATE = gfs_{init?fmt=%Y%m%d%H}_F{lead?fmt=%3H}.grib FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombine_bucket FCST_PCP_COMBINE_OUTPUT_TEMPLATE = gfs_{valid?fmt=%Y%m%d%H}_A{level?fmt=%3H}.nc + +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +FCST_PCP_COMBINE_METHOD = ADD + #LOG_PCP_COMBINE_VERBOSITY = 2 FCST_PCP_COMBINE_MAX_FORECAST = 2d diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_derive.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_derive.conf index 5276d22f39..da89543b9c 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_derive.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_derive.conf @@ -1,7 +1,30 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_derive.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 = PCPCombine + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2005080700 @@ -12,10 +35,13 @@ LEAD_SEQ = 24H LOOP_ORDER = times -#LOG_PCP_COMBINE_VERBOSITY = 2 + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### FCST_PCP_COMBINE_RUN = True -FCST_PCP_COMBINE_METHOD = DERIVE FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 @@ -23,6 +49,16 @@ FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombine_derive FCST_PCP_COMBINE_OUTPUT_TEMPLATE = wrfprs_ruc13_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HH}_A{level?fmt=%HH}.nc + +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +#LOG_PCP_COMBINE_VERBOSITY = 2 + +FCST_PCP_COMBINE_METHOD = DERIVE + FCST_PCP_COMBINE_STAT_LIST = sum,min,max,range,mean,stdev,vld_count FCST_PCP_COMBINE_DERIVE_LOOKBACK = 18H diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_loop_custom.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_loop_custom.conf index 1155e41111..dcc7aa1269 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_loop_custom.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_loop_custom.conf @@ -1,6 +1,29 @@ [config] -PROCESS_LIST = PCPCombine +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_loop_custom.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 = PcpCombine + + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H @@ -10,14 +33,17 @@ INIT_INCREMENT = 1M LEAD_SEQ = 24H +PCP_COMBINE_CUSTOM_LOOP_LIST = arw-fer-gep1, arw-fer-gep5, arw-sch-gep2, arw-sch-gep6, arw-tom-gep3, arw-tom-gep7 + LOOP_ORDER = times -PCP_COMBINE_CUSTOM_LOOP_LIST = arw-fer-gep1, arw-fer-gep5, arw-sch-gep2, arw-sch-gep6, arw-tom-gep3, arw-tom-gep7 -#LOG_PCP_COMBINE_VERBOSITY = 2 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### FCST_PCP_COMBINE_RUN = True -FCST_PCP_COMBINE_METHOD = ADD FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/{custom?fmt=%s}/d01_{init?fmt=%Y%m%d%H}_0{lead?fmt=%HH}00.grib @@ -25,6 +51,16 @@ FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/{custom?fmt=%s}/d01_{init? FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombine_loop_custom FCST_PCP_COMBINE_OUTPUT_TEMPLATE = {custom?fmt=%s}/d01_{init?fmt=%Y%m%d%H}_0{lead?fmt=%HH}00.nc + +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +#LOG_PCP_COMBINE_VERBOSITY = 2 + +FCST_PCP_COMBINE_METHOD = ADD + FCST_PCP_COMBINE_CONSTANT_INIT = True FCST_PCP_COMBINE_MAX_FORECAST = 2d diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_python_embedding.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_python_embedding.conf index 7e72c8b1df..8aaa2fff3a 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_python_embedding.conf @@ -1,6 +1,29 @@ [config] -PROCESS_LIST = PCPCombine +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_python_embedding.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 = PcpCombine + + +### +# 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 @@ -12,10 +35,13 @@ LEAD_SEQ = 0 LOOP_ORDER = times -#LOG_PCP_COMBINE_VERBOSITY = 2 + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### OBS_PCP_COMBINE_RUN = True -OBS_PCP_COMBINE_METHOD = ADD OBS_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/new/imerg OBS_PCP_COMBINE_INPUT_TEMPLATE = PYTHON_NUMPY @@ -24,6 +50,15 @@ OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombin OBS_PCP_COMBINE_OUTPUT_TEMPLATE = IMERG.{valid?fmt=%Y%m%d_%H%M}_A{level?fmt=%2H}h +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +#LOG_PCP_COMBINE_VERBOSITY = 2 + +OBS_PCP_COMBINE_METHOD = ADD + OBS_VAR1_NAME = APCP OBS_VAR1_LEVELS = A06 @@ -33,4 +68,4 @@ OBS_PCP_COMBINE_INPUT_NAMES = {PARM_BASE}/use_cases/met_tool_wrapper/PCPCombine/ [user_env_vars] # uncomment and change this to the path of a version of python that has the h5py package installed -#MET_PYTHON_EXE = /path/to/python/with/h5-py/and/numpy/packages/bin/python \ No newline at end of file +#MET_PYTHON_EXE = /path/to/python/with/h5-py/and/numpy/packages/bin/python diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_subtract.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_subtract.conf index 38001d23a3..63cebfefe2 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_subtract.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_subtract.conf @@ -1,6 +1,29 @@ [config] -PROCESS_LIST = PCPCombine +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_subtract.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 = PcpCombine + + +### +# 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 = INIT @@ -13,10 +36,12 @@ LEAD_SEQ = 18H LOOP_ORDER = times -#LOG_PCP_COMBINE_VERBOSITY = 2 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### FCST_PCP_COMBINE_RUN = True -FCST_PCP_COMBINE_METHOD = SUBTRACT FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 @@ -24,6 +49,16 @@ FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombine_subtract FCST_PCP_COMBINE_OUTPUT_TEMPLATE = wrfprs_ruc13_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HH}_A03.nc + +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +#LOG_PCP_COMBINE_VERBOSITY = 2 + +FCST_PCP_COMBINE_METHOD = SUBTRACT + FCST_PCP_COMBINE_MAX_FORECAST = 2d FCST_IS_PROB = false diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_sum.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_sum.conf index bad19b6f74..bbc63b60e0 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_sum.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_sum.conf @@ -1,6 +1,29 @@ [config] -PROCESS_LIST = PCPCombine +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_sum.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 = PcpCombine + + +### +# 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 @@ -12,8 +35,13 @@ LEAD_SEQ = 15M LOOP_ORDER = times + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + FCST_PCP_COMBINE_RUN = True -FCST_PCP_COMBINE_METHOD = SUM FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/new FCST_PCP_COMBINE_INPUT_TEMPLATE = NEWSe_{init?fmt=%Y%m%d}_i{init?fmt=%H%M}_m0_f* @@ -21,6 +49,14 @@ FCST_PCP_COMBINE_INPUT_TEMPLATE = NEWSe_{init?fmt=%Y%m%d}_i{init?fmt=%H%M}_m0_f* FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombine_sum FCST_PCP_COMBINE_OUTPUT_TEMPLATE = NEWSe5min_mem00_lag00.nc + +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +FCST_PCP_COMBINE_METHOD = SUM + #LOG_PCP_COMBINE_VERBOSITY = 2 FCST_IS_PROB = false diff --git a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_user_defined.conf b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_user_defined.conf index 6ec72af5db..c0503bcede 100644 --- a/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_user_defined.conf +++ b/parm/use_cases/met_tool_wrapper/PCPCombine/PCPCombine_user_defined.conf @@ -1,6 +1,30 @@ [config] -PROCESS_LIST = PCPCombine +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PCPCombine/PCPCombine_user_defined.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 = PcpCombine + + +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H @@ -12,8 +36,13 @@ LEAD_SEQ = 24H LOOP_ORDER = times + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + FCST_PCP_COMBINE_RUN = True -FCST_PCP_COMBINE_METHOD = USER_DEFINED FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 @@ -22,6 +51,13 @@ FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/PCPCombine/PCPCombi FCST_PCP_COMBINE_OUTPUT_TEMPLATE = wrfprs_ruc13_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HH}_A{level?fmt=%HH}.nc +### +# PCPCombine Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pcpcombine +### + +FCST_PCP_COMBINE_METHOD = USER_DEFINED + FCST_PCP_COMBINE_COMMAND = -derive sum,min,max,range,mean,stdev,vld_count {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH}.tm00_G212 {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH?shift=-3H}.tm00_G212 {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH?shift=-6H}.tm00_G212 {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH?shift=-9H}.tm00_G212 {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH?shift=-12H}.tm00_G212 {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%HH?shift=-15H}.tm00_G212 -field 'name="{FCST_PCP_COMBINE_INPUT_NAMES}"; level="{FCST_PCP_COMBINE_INPUT_LEVELS}";' #LOG_PCP_COMBINE_VERBOSITY = 2 diff --git a/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_grib1.conf b/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_grib1.conf index 5a2a113c74..1fd05a6180 100644 --- a/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_grib1.conf +++ b/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_grib1.conf @@ -1,62 +1,71 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only PlotDataPlane for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PlotDataPlane/PlotDataPlane_grib1.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 = PlotDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 20070330 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 20070330 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 0 LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for PlotDataPlane only -LOG_PLOT_DATA_PLANE_VERBOSITY = 1 -PLOT_DATA_PLANE_FIELD_NAME = TMP -PLOT_DATA_PLANE_FIELD_LEVEL = Z2 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -PLOT_DATA_PLANE_TITLE = GRIB1 NAM {PLOT_DATA_PLANE_FIELD_LEVEL} {PLOT_DATA_PLANE_FIELD_NAME} +PLOT_DATA_PLANE_INPUT_DIR = +PLOT_DATA_PLANE_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_fcst/{valid?fmt=%Y%m%d%H}/nam.t{valid?fmt=%H}z.awip1236.tm00.{valid?fmt=%Y%m%d}.grb -PLOT_DATA_PLANE_COLOR_TABLE = +PLOT_DATA_PLANE_OUTPUT_DIR = +PLOT_DATA_PLANE_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/plot_data_plane/nam.t00z.awip1236.tm{valid?fmt=%H}.{valid?fmt=%Y%m%d}_TMPZ2.ps -PLOT_DATA_PLANE_RANGE_MIN_MAX = -# End of [config] section and start of [dir] section -[dir] +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -PLOT_DATA_PLANE_INPUT_DIR = -PLOT_DATA_PLANE_OUTPUT_DIR = +PLOT_DATA_PLANE_FIELD_NAME = TMP +PLOT_DATA_PLANE_FIELD_LEVEL = Z2 -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# Template to look for input to PlotDataPlane relative to PLOT_DATA_PLANE_INPUT_DIR -PLOT_DATA_PLANE_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_fcst/{valid?fmt=%Y%m%d%H}/nam.t{valid?fmt=%H}z.awip1236.tm00.{valid?fmt=%Y%m%d}.grb +### +# PlotDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#plotdataplane +### -# Template to use to write output from PlotDataPlane -PLOT_DATA_PLANE_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/plot_data_plane/nam.t00z.awip1236.tm{valid?fmt=%H}.{valid?fmt=%Y%m%d}_TMPZ2.ps +LOG_PLOT_DATA_PLANE_VERBOSITY = 1 + +PLOT_DATA_PLANE_TITLE = GRIB1 NAM {PLOT_DATA_PLANE_FIELD_LEVEL} {PLOT_DATA_PLANE_FIELD_NAME} + +PLOT_DATA_PLANE_COLOR_TABLE = + +PLOT_DATA_PLANE_RANGE_MIN_MAX = diff --git a/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_netcdf.conf b/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_netcdf.conf index 2fab9741e4..38edc72430 100644 --- a/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_netcdf.conf +++ b/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_netcdf.conf @@ -1,62 +1,70 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only PlotDataPlane for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PlotDataPlane/PlotDataPlane_netcdf.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 = PlotDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 2005080712 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 2005080712 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 0 LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for PlotDataPlane only -LOG_PLOT_DATA_PLANE_VERBOSITY = 1 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -PLOT_DATA_PLANE_FIELD_NAME = APCP_12 -PLOT_DATA_PLANE_FIELD_LEVEL = "(*,*)" +PLOT_DATA_PLANE_INPUT_DIR = +PLOT_DATA_PLANE_INPUT_TEMPLATE = {INPUT_BASE}/met_test/out/pcp_combine/sample_fcst_12L_{valid?fmt=%Y%m%d%H}V_12A.nc -PLOT_DATA_PLANE_TITLE = NC MET 12-hour APCP +PLOT_DATA_PLANE_OUTPUT_DIR = +PLOT_DATA_PLANE_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/plot_data_plane/sample_fcst_12L_{valid?fmt=%Y%m%d%H}V_12A_APCP12_NC_MET.ps -PLOT_DATA_PLANE_COLOR_TABLE = -PLOT_DATA_PLANE_RANGE_MIN_MAX = 1.0 3.0 +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### +PLOT_DATA_PLANE_FIELD_NAME = APCP_12 +PLOT_DATA_PLANE_FIELD_LEVEL = "(*,*)" -# End of [config] section and start of [dir] section -[dir] -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -PLOT_DATA_PLANE_INPUT_DIR = -PLOT_DATA_PLANE_OUTPUT_DIR = +### +# PlotDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#plotdataplane +### + +LOG_PLOT_DATA_PLANE_VERBOSITY = 1 -# End of [dir] section and start of [filename_templates] section -[filename_templates] +PLOT_DATA_PLANE_TITLE = NC MET 12-hour APCP -# Template to look for input to PlotDataPlane relative to PLOT_DATA_PLANE_INPUT_DIR -PLOT_DATA_PLANE_INPUT_TEMPLATE = {INPUT_BASE}/met_test/out/pcp_combine/sample_fcst_12L_{valid?fmt=%Y%m%d%H}V_12A.nc -# Template to use to write output from PlotDataPlane -PLOT_DATA_PLANE_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/plot_data_plane/sample_fcst_12L_{valid?fmt=%Y%m%d%H}V_12A_APCP12_NC_MET.ps +PLOT_DATA_PLANE_COLOR_TABLE = + +PLOT_DATA_PLANE_RANGE_MIN_MAX = 1.0 3.0 diff --git a/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_python_embedding.conf b/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_python_embedding.conf index 311adaa85e..5e4b3f5c00 100644 --- a/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/PlotDataPlane/PlotDataPlane_python_embedding.conf @@ -1,62 +1,71 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only PlotDataPlane for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PlotDataPlane/PlotDataPlane_python_embedding.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 = PlotDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 2005080712 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 2005080712 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 0 LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for PlotDataPlane only -LOG_PLOT_DATA_PLANE_VERBOSITY = 1 -PLOT_DATA_PLANE_FIELD_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -PLOT_DATA_PLANE_TITLE = Python Embedding FCST +PLOT_DATA_PLANE_INPUT_DIR = +PLOT_DATA_PLANE_INPUT_TEMPLATE = PYTHON_NUMPY -PLOT_DATA_PLANE_COLOR_TABLE = +PLOT_DATA_PLANE_OUTPUT_DIR = +PLOT_DATA_PLANE_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/plot_data_plane/py_embed_fcst.ps -PLOT_DATA_PLANE_RANGE_MIN_MAX = +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# End of [config] section and start of [dir] section -[dir] +PLOT_DATA_PLANE_FIELD_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -PLOT_DATA_PLANE_INPUT_DIR = -PLOT_DATA_PLANE_OUTPUT_DIR = -# End of [dir] section and start of [filename_templates] section -[filename_templates] +### +# PlotDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#plotdataplane +### -# Template to look for input to PlotDataPlane relative to PLOT_DATA_PLANE_INPUT_DIR -PLOT_DATA_PLANE_INPUT_TEMPLATE = PYTHON_NUMPY +# Verbosity of MET output - overrides LOG_VERBOSITY for PlotDataPlane only +LOG_PLOT_DATA_PLANE_VERBOSITY = 1 -# Template to use to write output from PlotDataPlane -PLOT_DATA_PLANE_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/plot_data_plane/py_embed_fcst.ps +PLOT_DATA_PLANE_TITLE = Python Embedding FCST + +PLOT_DATA_PLANE_COLOR_TABLE = + +PLOT_DATA_PLANE_RANGE_MIN_MAX = diff --git a/parm/use_cases/met_tool_wrapper/Point2Grid/Point2Grid.conf b/parm/use_cases/met_tool_wrapper/Point2Grid/Point2Grid.conf index 4da0f30ba4..7d0a9e5a23 100644 --- a/parm/use_cases/met_tool_wrapper/Point2Grid/Point2Grid.conf +++ b/parm/use_cases/met_tool_wrapper/Point2Grid/Point2Grid.conf @@ -1,100 +1,77 @@ [config] -## Configuration-related settings such as the process list, begin and end times, etc. -# List of applications to run - only Point2Grid for this case -PROCESS_LIST = Point2Grid +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/Point2Grid/Point2Grid.html -# time looping - options are INIT, VALID, RETRO, and REALTIME +# 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 = Point2Grid + + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG = 2017060100 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END = 2017060300 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 24H -# List of forecast leads to process for each run time (init or valid) -# If unset, defaults to 0 (don't loop through forecast leads LEAD_SEQ = 12H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for Point2Grid only -# This has shown to be a bad idea because it takes precedence over LOG_MET_VERBOSITY/LOG_VERBOSIT -# LOG_POINT2GRID_VERBOSITY = 1 -# Time relative to valid time (in seconds if no units are specified) to allow files to be considered -# valid. Set both BEGIN and END to 0 to require the exact time in the filename -# Not used in this example. +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +POINT2GRID_INPUT_DIR = +POINT2GRID_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_obs/prepbufr/sample_pb.nc + +POINT2GRID_OUTPUT_DIR = +POINT2GRID_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/Point2Grid/grid.{init?fmt=%Y%d%H}.nc + POINT2GRID_FILE_WINDOW_BEGIN = 0 POINT2GRID_FILE_WINDOW_END = 0 -# Value to pass with the -to_grid See MET User's Guide for more information + +### +# Point2Grid Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#point2grid +### + +# LOG_POINT2GRID_VERBOSITY = 1 + POINT2GRID_REGRID_TO_GRID = G212 -# Value to pass with the -field string. See MET User's Guide for more information -# FIELD and LEVEL both end up in the -field string POINT2GRID_INPUT_FIELD =TMP POINT2GRID_INPUT_LEVEL = -# Value to pass with the -qc argument POINT2GRID_QC_FLAGS = 0 -# Value to pass with the -adp argument - This is a file name with GOES Aerosol Detection Product data POINT2GRID_ADP = -# Value to pass with the -method argumen - Default is UW_MEAN, other examples are -POINT2GRID_REGRID_METHOD = MAX +POINT2GRID_REGRID_METHOD = MAX -# Value to pass with the -gaussian-dx argument - Distance interval for gaussian smoothing -# Default is 81.271 POINT2GRID_GAUSSIAN_DX = 81.271 +POINT2GRID_GAUSSIAN_RADIUS = 120 -# Value to pass with the -gaussian-radius argument - radius of influence for the gaussian smoothing -# Default is 120 -POINT2GRID_GAUSSIAN_RADIUS = 120 - -# Value to pass with the -prob_cat_thresh argument - threshold for probability of occurrence POINT2GRID_PROB_CAT_THRESH = -# Value to pass with the -vld_thresh argument - threshold for percentage of valid data .5 default -POINT2GRID_VLD_THRESH = - -# End of [config] section and start of [dir] section -[dir] - -# Input/Output directories can be left empty if the corresponding template contains the full path to the files -POINT2GRID_INPUT_DIR = - -POINT2GRID_OUTPUT_DIR = - -# End of [dir] section and start of [filename_templates] section -[filename_templates] - -# Template to look for input to Point2Grid relative to POINT2GRID_INPUT_DIR -POINT2GRID_INPUT_TEMPLATE = {INPUT_BASE}/met_test/data/sample_obs/prepbufr/sample_pb.nc - -# Template to use to write output from Point2Grid -POINT2GRID_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/Point2Grid/grid.{init?fmt=%Y%d%H}.nc +POINT2GRID_VLD_THRESH = diff --git a/parm/use_cases/met_tool_wrapper/PointStat/PointStat.conf b/parm/use_cases/met_tool_wrapper/PointStat/PointStat.conf index dfa83ecf4e..0a5d9e61fb 100644 --- a/parm/use_cases/met_tool_wrapper/PointStat/PointStat.conf +++ b/parm/use_cases/met_tool_wrapper/PointStat/PointStat.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PointStat/PointStat.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 = PointStat + ### # 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 = INIT @@ -14,8 +33,10 @@ INIT_INCREMENT = 1M LEAD_SEQ = 36 + ### # 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}/met_test/data/sample_fcst @@ -32,8 +53,10 @@ POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = POINT_STAT_CLIMO_STDEV_INPUT_DIR = POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = + ### # Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info ### POINT_STAT_ONCE_PER_FIELD = False @@ -62,8 +85,10 @@ OBS_VAR3_NAME = VGRD OBS_VAR3_LEVELS = Z10 OBS_VAR3_THRESH = >=5 + ### -# PointStat +# PointStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat ### #LOG_POINT_STAT_VERBOSITY = 2 diff --git a/parm/use_cases/met_tool_wrapper/PointStat/PointStat_once_per_field.conf b/parm/use_cases/met_tool_wrapper/PointStat/PointStat_once_per_field.conf index fb56e2f52a..3a1d098f65 100644 --- a/parm/use_cases/met_tool_wrapper/PointStat/PointStat_once_per_field.conf +++ b/parm/use_cases/met_tool_wrapper/PointStat/PointStat_once_per_field.conf @@ -1,120 +1,68 @@ [config] -# List of applications to run - only PointStat for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PointStat/PointStat_once_per_field.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 = PointStat -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 20070330 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 20070330 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = processes -# Verbosity of MET output - overrides LOG_VERBOSITY for PointStat only -#LOG_POINT_STAT_VERBOSITY = 2 - -# Location of MET config file to pass to GridStat -# References PARM_BASE which is the location of the parm directory corresponding -# to the ush directory of the run_metplus.py script that is called -# or the value of the environment variable METPLUS_PARM_BASE if set -POINT_STAT_CONFIG_FILE ={PARM_BASE}/met_config/PointStatConfig_wrapped - -POINT_STAT_CLIMO_MEAN_TIME_INTERP_METHOD = NEAREST - -POINT_STAT_INTERP_TYPE_METHOD = BILIN -POINT_STAT_INTERP_TYPE_WIDTH = 2 -POINT_STAT_OUTPUT_FLAG_SL1L2 = STAT -POINT_STAT_OUTPUT_FLAG_VL1L2 = STAT - -# Time relative to each input file's valid time (in seconds if no units are specified) for data within the file to be -# considered valid. Values are set in the 'obs_window' dictionary in the PointStat config file -OBS_POINT_STAT_WINDOW_BEGIN = -5400 -OBS_POINT_STAT_WINDOW_END = 5400 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Optional list of offsets to look for point observation data -POINT_STAT_OFFSETS = 0 - -# Model/fcst and obs name, e.g. GFS, NAM, GDAS, etc. -MODEL = WRF -OBTYPE = - -#POINT_STAT_DESC = - -# Regrid to specified grid. Indicate NONE if no regridding, or the grid id -# (e.g. G212) -POINT_STAT_REGRID_TO_GRID = NONE -POINT_STAT_REGRID_METHOD = BILIN -POINT_STAT_REGRID_WIDTH = 2 +FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst +FCST_POINT_STAT_INPUT_TEMPLATE = {valid?fmt=%Y%m%d%H}/nam.t00z.awip1236.tm00.{valid?fmt=%Y%m%d}.grb -#POINT_STAT_OUTPUT_PREFIX = {fcst_name?fmt=%s}_{fcst_level?fmt=%s} -POINT_STAT_OUTPUT_PREFIX = {CURRENT_FCST_NAME}_{CURRENT_FCST_LEVEL} +OBS_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/out/pb2nc +OBS_POINT_STAT_INPUT_TEMPLATE = sample_pb.nc -# sets the -obs_valid_beg command line argument (optional) -# not used for this example -#POINT_STAT_OBS_VALID_BEG = {valid?fmt=%Y%m%d_%H} +POINT_STAT_CLIMO_MEAN_INPUT_DIR = +POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = -# sets the -obs_valid_end command line argument (optional) -# not used for this example -#POINT_STAT_OBS_VALID_END = {valid?fmt=%Y%m%d_%H} +POINT_STAT_CLIMO_STDEV_INPUT_DIR = +POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = -# Verification Masking regions -# Indicate which grid and polygon masking region, if applicable -POINT_STAT_GRID = DTC165, DTC166 +POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat -# List of full path to poly masking files. NOTE: Only short lists of poly -# files work (those that fit on one line), a long list will result in an -# environment variable that is too long, resulting in an error. For long -# lists of poly masking files (i.e. all the mask files in the NCEP_mask -# directory), define these in the MET point_stat configuration file. -POINT_STAT_POLY = MET_BASE/poly/LMV.poly -POINT_STAT_STATION_ID = -# Message types, if all message types are to be returned, leave this empty, -# otherwise indicate the message types of interest. -POINT_STAT_MESSAGE_TYPE = ADPUPA, ADPSFC -# Variables and levels as specified in the field dictionary of the MET -# point_stat configuration file. Specify as FCST_VARn_NAME, FCST_VARn_LEVELS, -# (optional) FCST_VARn_OPTION +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# set to True to run PointStat once for each name/level combination -# set to False to run PointStat once per run time including all fields POINT_STAT_ONCE_PER_FIELD = True -# fields to compare -# Note: If FCST_VAR_* is set, then a corresponding OBS_VAR_* variable must be set -# To use one variables for both forecast and observation data, set BOTH_VAR_* instead FCST_VAR1_NAME = TMP FCST_VAR1_LEVELS = P750-900 FCST_VAR1_THRESH = <=273, >273 @@ -137,37 +85,46 @@ OBS_VAR3_LEVELS = Z10 OBS_VAR3_THRESH = >=5 -# End of [config] section and start of [dir] section -[dir] -FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst -OBS_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/out/pb2nc +### +# PointStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat +### -# directory containing climatology mean input to PointStat -# Not used in this example -POINT_STAT_CLIMO_MEAN_INPUT_DIR = +#LOG_POINT_STAT_VERBOSITY = 2 -# directory containing climatology mean input to PointStat -# Not used in this example -POINT_STAT_CLIMO_STDEV_INPUT_DIR = +POINT_STAT_CONFIG_FILE ={PARM_BASE}/met_config/PointStatConfig_wrapped +POINT_STAT_CLIMO_MEAN_TIME_INTERP_METHOD = NEAREST -POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat +POINT_STAT_INTERP_TYPE_METHOD = BILIN +POINT_STAT_INTERP_TYPE_WIDTH = 2 +POINT_STAT_OUTPUT_FLAG_SL1L2 = STAT +POINT_STAT_OUTPUT_FLAG_VL1L2 = STAT -# End of [dir] section and start of [filename_templates] section -[filename_templates] +OBS_POINT_STAT_WINDOW_BEGIN = -5400 +OBS_POINT_STAT_WINDOW_END = 5400 -# Template to look for forecast input to PointStat relative to FCST_POINT_STAT_INPUT_DIR -FCST_POINT_STAT_INPUT_TEMPLATE = {valid?fmt=%Y%m%d%H}/nam.t00z.awip1236.tm00.{valid?fmt=%Y%m%d}.grb +POINT_STAT_OFFSETS = 0 -# Template to look for observation input to PointStat relative to OBS_POINT_STAT_INPUT_DIR -OBS_POINT_STAT_INPUT_TEMPLATE = sample_pb.nc +MODEL = WRF +OBTYPE = -# Template to look for climatology input to PointStat relative to POINT_STAT_CLIMO_MEAN_INPUT_DIR -# Not used in this example -POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = +#POINT_STAT_DESC = -# Template to look for climatology input to PointStat relative to POINT_STAT_CLIMO_STDEV_INPUT_DIR -# Not used in this example -POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = +POINT_STAT_REGRID_TO_GRID = NONE +POINT_STAT_REGRID_METHOD = BILIN +POINT_STAT_REGRID_WIDTH = 2 +#POINT_STAT_OUTPUT_PREFIX = {fcst_name?fmt=%s}_{fcst_level?fmt=%s} +POINT_STAT_OUTPUT_PREFIX = {CURRENT_FCST_NAME}_{CURRENT_FCST_LEVEL} + +#POINT_STAT_OBS_VALID_BEG = {valid?fmt=%Y%m%d_%H} +#POINT_STAT_OBS_VALID_END = {valid?fmt=%Y%m%d_%H} + +POINT_STAT_GRID = DTC165, DTC166 +POINT_STAT_POLY = MET_BASE/poly/LMV.poly + +POINT_STAT_STATION_ID = + +POINT_STAT_MESSAGE_TYPE = ADPUPA, ADPSFC diff --git a/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding.conf b/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding.conf index 7e07e8624f..e22eae5194 100644 --- a/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding.conf @@ -1,53 +1,82 @@ [config] -# List of applications to run - only PointStat for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PointStat/PointStat_python_embedding.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 = PointStat -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match VALID_TIME_FMT VALID_BEG = 2020090606 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 2020090606 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = processes -# Verbosity of MET output - overrides LOG_VERBOSITY for PointStat only + +### +# 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}/met_test/new/point_stat_input/vvwind +FCST_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY + +OBS_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new/point_stat_input/prepbufr +OBS_POINT_STAT_INPUT_TEMPLATE = gdas.{valid?fmt=%Y%m%d}.t{valid?fmt=%H}z.nc + +POINT_STAT_CLIMO_MEAN_INPUT_DIR = +POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = + +POINT_STAT_CLIMO_STDEV_INPUT_DIR = +POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = + +POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_py_embed + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +POINT_STAT_ONCE_PER_FIELD = False + +SCRIPT_DIR = {PARM_BASE}/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding +FCST_VAR1_NAME = {SCRIPT_DIR}/read_NRL_binary.py {FCST_POINT_STAT_INPUT_DIR}/vvwind_zht_0010.0_0000.0_glob360x181_{init?fmt=%Y%m%d%H}_{lead?fmt=%4H}0000_fcstfld + +OBS_VAR1_NAME = VGRD +OBS_VAR1_LEVELS = Z0 + + +### +# PointStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat +### + #LOG_POINT_STAT_VERBOSITY = 2 -# Location of MET config file to pass to GridStat -# References PARM_BASE which is the location of the parm directory corresponding -# to the ush directory of the master_metplus.py script that is called -# or the value of the environment variable METPLUS_PARM_BASE if set POINT_STAT_CONFIG_FILE ={PARM_BASE}/met_config/PointStatConfig_wrapped POINT_STAT_CLIMO_MEAN_TIME_INTERP_METHOD = NEAREST @@ -58,15 +87,11 @@ POINT_STAT_INTERP_TYPE_WIDTH = 2 POINT_STAT_OUTPUT_FLAG_SL1L2 = STAT POINT_STAT_OUTPUT_FLAG_VL1L2 = STAT -# Time relative to each input file's valid time (in seconds if no units are specified) for data within the file to be -# considered valid. Values are set in the 'obs_window' dictionary in the PointStat config file OBS_POINT_STAT_WINDOW_BEGIN = -5400 OBS_POINT_STAT_WINDOW_END = 5400 -# Optional list of offsets to look for point observation data POINT_STAT_OFFSETS = 0 -# Model/fcst and obs name, e.g. GFS, NAM, GDAS, etc. #MODEL = #POINT_STAT_DESC = NA @@ -77,79 +102,12 @@ POINT_STAT_OFFSETS = 0 POINT_STAT_OUTPUT_PREFIX = -# sets the -obs_valid_beg command line argument (optional) -# not used for this example #POINT_STAT_OBS_VALID_BEG = {valid?fmt=%Y%m%d_%H} - -# sets the -obs_valid_end command line argument (optional) -# not used for this example #POINT_STAT_OBS_VALID_END = {valid?fmt=%Y%m%d_%H} -# Verification Masking regions -# Indicate which grid and polygon masking region, if applicable POINT_STAT_GRID = FULL -# List of full path to poly masking files. NOTE: Only short lists of poly -# files work (those that fit on one line), a long list will result in an -# environment variable that is too long, resulting in an error. For long -# lists of poly masking files (i.e. all the mask files in the NCEP_mask -# directory), define these in the MET point_stat configuration file. POINT_STAT_POLY = POINT_STAT_STATION_ID = -# Message types, if all message types are to be returned, leave this empty, -# otherwise indicate the message types of interest. POINT_STAT_MESSAGE_TYPE = ADPUPA - -# Variables and levels as specified in the field dictionary of the MET -# point_stat configuration file. Specify as FCST_VARn_NAME, FCST_VARn_LEVELS, -# (optional) FCST_VARn_OPTION - -# set to True to run PointStat once for each name/level combination -# set to False to run PointStat once per run time including all fields -POINT_STAT_ONCE_PER_FIELD = False - -# fields to compare -# Note: If FCST_VAR_* is set, then a corresponding OBS_VAR_* variable must be set -# To use one variables for both forecast and observation data, set BOTH_VAR_* instead -SCRIPT_DIR = {PARM_BASE}/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding -FCST_VAR1_NAME = {SCRIPT_DIR}/read_NRL_binary.py {FCST_POINT_STAT_INPUT_DIR}/vvwind_zht_0010.0_0000.0_glob360x181_{init?fmt=%Y%m%d%H}_{lead?fmt=%4H}0000_fcstfld - -OBS_VAR1_NAME = VGRD -OBS_VAR1_LEVELS = Z0 - - -# End of [config] section and start of [dir] section -[dir] -FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new/point_stat_input/vvwind -OBS_POINT_STAT_INPUT_DIR = {INPUT_BASE}/met_test/new/point_stat_input/prepbufr - -# directory containing climatology mean input to PointStat -# Not used in this example -POINT_STAT_CLIMO_MEAN_INPUT_DIR = - -# directory containing climatology mean input to PointStat -# Not used in this example -POINT_STAT_CLIMO_STDEV_INPUT_DIR = - - -POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_py_embed - - -# End of [dir] section and start of [filename_templates] section -[filename_templates] - -# Template to look for forecast input to PointStat relative to FCST_POINT_STAT_INPUT_DIR -FCST_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY - -# Template to look for observation input to PointStat relative to OBS_POINT_STAT_INPUT_DIR -OBS_POINT_STAT_INPUT_TEMPLATE = gdas.{valid?fmt=%Y%m%d}.t{valid?fmt=%H}z.nc - -# Template to look for climatology input to PointStat relative to POINT_STAT_CLIMO_MEAN_INPUT_DIR -# Not used in this example -POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = - -# Template to look for climatology input to PointStat relative to POINT_STAT_CLIMO_STDEV_INPUT_DIR -# Not used in this example -POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = - diff --git a/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.conf b/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.conf index 2b0bdfc800..96af438ba3 100644 --- a/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.conf +++ b/parm/use_cases/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.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 = PointStat + ### # 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 = INIT @@ -14,8 +33,10 @@ INIT_INCREMENT = 1M LEAD_SEQ = 36 + ### # 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}/met_test/data/sample_fcst @@ -32,8 +53,10 @@ POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = POINT_STAT_CLIMO_STDEV_INPUT_DIR = POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = + ### # Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info ### POINT_STAT_ONCE_PER_FIELD = False @@ -62,8 +85,10 @@ OBS_VAR3_NAME = VGRD OBS_VAR3_LEVELS = Z10 OBS_VAR3_THRESH = >=5 + ### -# PointStat +# PointStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat ### #LOG_POINT_STAT_VERBOSITY = 2 diff --git a/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest.conf b/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest.conf index 779d02572f..6114202c61 100644 --- a/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest.conf +++ b/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest.conf @@ -1,72 +1,57 @@ -# PyEmbedIngest wrapper example - [config] -# Options are times, processes -# times = run all items in the PROCESS_LIST for a single initialization -# time, then repeat until all times have been evaluated. -# processes = run each item in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST. -LOOP_ORDER = times -# time looping - options are INIT, VALID, RETRO, and REALTIME -LOOP_BY = VALID +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest.html -# Format of VALID_BEG and VALID_END -VALID_TIME_FMT = %Y%m%d%H +# For additional information, please see the METplus Users Guide. +# https://metplus.readthedocs.io/en/latest/Users_Guide -# Start time for METplus run -VALID_BEG = 2013022712 +### +# Processes to run +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#process-list +### + +PROCESS_LIST = PyEmbedIngest -# End time for METplus run -VALID_END = 2013022712 -# Increment between METplus runs in seconds. Must be >= 60 +### +# 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 +VALID_BEG = 2013022712 +VALID_END = 2013022712 VALID_INCREMENT = 21600 -# list of forecast leads to process LEAD_SEQ = 0 -# List of applications to run -PROCESS_LIST = PyEmbedIngest +LOOP_ORDER = times -# 1st INGEST INSTANCE -# python script with optional arguments to run for 1st ingest instance -PY_EMBED_INGEST_1_SCRIPT = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS +### +# PyEmbedIngest Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pyembedingest +### -# type of python input to expect for 1st ingest instance -# valid options: NUMPY, XARRAY -PY_EMBED_INGEST_1_TYPE = NUMPY +PY_EMBED_INGEST_1_OUTPUT_DIR = +PY_EMBED_INGEST_1_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/test.nc -# output grid for 1st ingest instance. Can be a grid definition or file path +PY_EMBED_INGEST_1_SCRIPT = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS +PY_EMBED_INGEST_1_TYPE = NUMPY PY_EMBED_INGEST_1_OUTPUT_GRID = G130 -# 2nd INGEST INSTANCE -# python script with optional arguments to run for 2nd ingest instance -PY_EMBED_INGEST_2_SCRIPT = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST +PY_EMBED_INGEST_2_OUTPUT_DIR = +PY_EMBED_INGEST_2_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/regrid_data_plane.nc -# type of python input to expect for 2nd ingest instance -# valid options: NUMPY, XARRAY +PY_EMBED_INGEST_2_SCRIPT = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST PY_EMBED_INGEST_2_TYPE = NUMPY - -# output grid for 2nd ingest instance. Can be a grid definition or file path PY_EMBED_INGEST_2_OUTPUT_GRID = G130 - -[dir] -# output directory for 1st ingest instance -# in this example, the full output path is set in PY_EMBED_INGEST_1_OUTPUT_TEMPLATE -PY_EMBED_INGEST_1_OUTPUT_DIR = - -# output directory for 2nd ingest instance -# in this example, the full output path is set in PY_EMBED_INGEST_2_OUTPUT_TEMPLATE -PY_EMBED_INGEST_2_OUTPUT_DIR = - -[filename_templates] -# output template to use for 1st ingest instance -# can optionally use [dir] PY_EMBED_INGEST_1_OUTPUT_DIR with this value -PY_EMBED_INGEST_1_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/test.nc - -# output template to use for 2nd ingest instance -# can optionally use [dir] PY_EMBED_INGEST_2_OUTPUT_DIR with this value -PY_EMBED_INGEST_2_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/regrid_data_plane.nc diff --git a/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest_multi_field_one_file.conf b/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest_multi_field_one_file.conf index 61e8963541..5f432ae4a2 100644 --- a/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest_multi_field_one_file.conf +++ b/parm/use_cases/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest_multi_field_one_file.conf @@ -1,78 +1,62 @@ -# PyEmbedIngest wrapper example - [config] -# Options are times, processes -# times = run all items in the PROCESS_LIST for a single initialization -# time, then repeat until all times have been evaluated. -# processes = run each item in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST. -LOOP_ORDER = times -# time looping - options are INIT, VALID, RETRO, and REALTIME -LOOP_BY = VALID +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PyEmbedIngest/PyEmbedIngest_multi_field_one_file.html -# Format of VALID_BEG and VALID_END -VALID_TIME_FMT = %Y%m%d%H +# For additional information, please see the METplus Users Guide. +# https://metplus.readthedocs.io/en/latest/Users_Guide -# Start time for METplus run -VALID_BEG = 2013022712 +### +# Processes to run +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#process-list +### + +PROCESS_LIST = PyEmbedIngest -# End time for METplus run -VALID_END = 2013022712 -# Increment between METplus runs in seconds. Must be >= 60 +### +# 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 +VALID_BEG = 2013022712 +VALID_END = 2013022712 VALID_INCREMENT = 21600 -# list of forecast leads to process LEAD_SEQ = 0 -# List of applications to run -PROCESS_LIST = PyEmbedIngest +LOOP_ORDER = times -# 1st INGEST INSTANCE -# python script with optional arguments to run for 1st ingest instance -# this ingest instance runs 1 scripts to generate 1 field -PY_EMBED_INGEST_1_SCRIPT_1 = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST +### +# PyEmbedIngest Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pyembedingest +### -# type of python input to expect for 1st ingest instance -# valid options: NUMPY, XARRAY -PY_EMBED_INGEST_1_TYPE = NUMPY +PY_EMBED_INGEST_1_OUTPUT_DIR = +PY_EMBED_INGEST_1_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/test.nc -# output grid for 1st ingest instance. Can be a grid definition or file path +PY_EMBED_INGEST_1_SCRIPT_1 = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST +PY_EMBED_INGEST_1_TYPE = NUMPY PY_EMBED_INGEST_1_OUTPUT_GRID = G130 -# 2nd INGEST INSTANCE -# python script with optional arguments to run for 2nd ingest instance -# this ingest instance runs 2 scripts to generate 2 fields +PY_EMBED_INGEST_2_OUTPUT_DIR = +PY_EMBED_INGEST_2_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/regrid_data_plane.nc + PY_EMBED_INGEST_2_SCRIPT_1 = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/fcst.txt FCST PY_EMBED_INGEST_2_OUTPUT_FIELD_NAME_1 = Forecast PY_EMBED_INGEST_2_SCRIPT_2 = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS PY_EMBED_INGEST_2_OUTPUT_FIELD_NAME_2 = Observation -# type of python input to expect for 2nd ingest instance -# valid options: NUMPY, XARRAY PY_EMBED_INGEST_2_TYPE = NUMPY - -# output grid for 2nd ingest instance. Can be a grid definition or file path PY_EMBED_INGEST_2_OUTPUT_GRID = G130 - -[dir] -# output directory for 1st ingest instance -# in this example, the full output path is set in PY_EMBED_INGEST_1_OUTPUT_TEMPLATE -PY_EMBED_INGEST_1_OUTPUT_DIR = - -# output directory for 2nd ingest instance -# in this example, the full output path is set in PY_EMBED_INGEST_2_OUTPUT_TEMPLATE -PY_EMBED_INGEST_2_OUTPUT_DIR = - -[filename_templates] -# output template to use for 1st ingest instance -# can optionally use [dir] PY_EMBED_INGEST_1_OUTPUT_DIR with this value -PY_EMBED_INGEST_1_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/test.nc - -# output template to use for 2nd ingest instance -# can optionally use [dir] PY_EMBED_INGEST_2_OUTPUT_DIR with this value -PY_EMBED_INGEST_2_OUTPUT_TEMPLATE = {OUTPUT_BASE}/met_tool_wrapper/PyEmbedIngest/regrid_data_plane.nc diff --git a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.conf b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.conf index 7a46f42917..d228cd7b6d 100644 --- a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.conf +++ b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.conf @@ -1,103 +1,81 @@ [config] -# List of applications to run - only RegridDataPlane for this case + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/RegridDataPlane/RegridDataPlane.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 = RegridDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 3H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# If True, run regrid_data_plane on observation data + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + OBS_REGRID_DATA_PLANE_RUN = True -# name of input field to process -# if unset, OBS_VAR1_NAME will be used -OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = APCP +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_obs/ST2ml -# level of input field to process -# if unset, OBS_VAR1_LEVELS will be used -OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = A01 +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/regrid_data_plane + +OBS_REGRID_DATA_PLANE_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}.Grb_G212 -# name of output field to create -# if unset, OBS_VAR1_NAME and OBS_VAR1_LEVELS will be combined to generate an output field name -OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = APCP_01 -# If running a MET tool comparison tool after RegridDataPlane, one can instead set OBS_VAR1_[NAME/LEVELS] to -# a value that corresponds to the desired name/level to use in the comparison -# this value will be used to determine output name/level to pass to RegridDataPlane as well -#OBS_VAR1_NAME = APCP -#OBS_VAR1_LEVELS = A01 +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = APCP +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = A01 +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = APCP_01 -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified REGRID_DATA_PLANE_ONCE_PER_FIELD = True -# Name to identify model data in output -MODEL = QPF -# Name to identify observation data in output +### +# RegridDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#regriddataplane +### + +MODEL = QPF OBTYPE = QPE -# Used by regrid_data_plane to remap data REGRID_DATA_PLANE_VERIF_GRID={INPUT_BASE}/met_test/data/sample_fcst/2005080700/wrfprs_ruc13_12.tm00_G212 -# method to run regrid_data_plane, not setting this will default to NEAREST REGRID_DATA_PLANE_METHOD = BUDGET -# regridding width used in regrid_data_plane, not setting this will default to 1 REGRID_DATA_PLANE_WIDTH = 2 -# Gaussian filter DX value to add as command line argument - not added if unset or blank REGRID_DATA_PLANE_GAUSSIAN_DX = -# Gaussian filter radius value to add as command line argument - not added if unset or blank REGRID_DATA_PLANE_GAUSSIAN_RADIUS = - -# End of [config] section and start of [dir] section -[dir] -# directory containing observation input to RegridDataPlane -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_obs/ST2ml - -# directory to write observation output from RegridDataPlane -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/regrid_data_plane - - -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# template to use to read input data and write output data for RegridDataPlane -# if different names for input and output are desired, set OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE -# and OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE instead -OBS_REGRID_DATA_PLANE_TEMPLATE = ST2ml{valid?fmt=%Y%m%d%H}.Grb_G212 diff --git a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_multi_file.conf b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_multi_file.conf index e0beea0ab0..dff538882f 100644 --- a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_multi_file.conf +++ b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_multi_file.conf @@ -1,106 +1,84 @@ [config] -# List of applications to run - only RegridDataPlane for this case + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_multi_file.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 = RegridDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 3H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# If True, run regrid_data_plane on observation data + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + OBS_REGRID_DATA_PLANE_RUN = True -# name of input field to process -# if unset, OBS_VAR1_NAME will be used -OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = APCP -OBS_REGRID_DATA_PLANE_VAR2_INPUT_FIELD_NAME = TMP +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%2H}.tm00_G212 -# level of input field to process -# if unset, OBS_VAR1_LEVELS will be used -OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = L0 -OBS_REGRID_DATA_PLANE_VAR2_INPUT_LEVEL = L0 +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/RegridDataPlane/multi_field_multi_file +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_{obs_name}_{lead?fmt=%2H}.tm00_G212 -# name of output field to create -# if unset, OBS_VAR1_NAME and OBS_VAR1_LEVELS will be combined to generate an output field name -OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = APCP_01 -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + REGRID_DATA_PLANE_ONCE_PER_FIELD = True -# If running a MET tool comparison tool after RegridDataPlane, one can instead set OBS_VAR1_[NAME/LEVELS] to -# a value that corresponds to the desired name/level to use in the comparison -# this value will be used to determine output name/level to pass to RegridDataPlane as well -#OBS_VAR1_NAME = APCP -#OBS_VAR1_LEVELS = A01 +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = APCP +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = L0 +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = APCP_01 + +OBS_REGRID_DATA_PLANE_VAR2_INPUT_FIELD_NAME = TMP +OBS_REGRID_DATA_PLANE_VAR2_INPUT_LEVEL = L0 -# Name to identify model data in output -MODEL = QPF -# Name to identify observation data in output +### +# RegridDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#regriddataplane +### + +MODEL = QPF OBTYPE = QPE -# Used by regrid_data_plane to remap data REGRID_DATA_PLANE_VERIF_GRID={INPUT_BASE}/met_test/data/sample_obs/ST2ml/ST2ml2005080703.Grb_G212 -# method to run regrid_data_plane, not setting this will default to NEAREST REGRID_DATA_PLANE_METHOD = BUDGET -# regridding width used in regrid_data_plane, not setting this will default to 1 REGRID_DATA_PLANE_WIDTH = 2 -# Gaussian filter DX value to add as command line argument - not added if unset or blank REGRID_DATA_PLANE_GAUSSIAN_DX = -# Gaussian filter radius value to add as command line argument - not added if unset or blank REGRID_DATA_PLANE_GAUSSIAN_RADIUS = - -# End of [config] section and start of [dir] section -[dir] -# directory containing observation input to RegridDataPlane -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst - -# directory to write observation output from RegridDataPlane -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/RegridDataPlane/multi_field_multi_file - - -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# template to use to read input data and write output data for RegridDataPlane -# if different names for input and output are desired, set OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE -# and OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE instead -OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%2H}.tm00_G212 -OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_{obs_name}_{lead?fmt=%2H}.tm00_G212 \ No newline at end of file diff --git a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_one_file.conf b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_one_file.conf index 06ab505ac2..f620440605 100644 --- a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_one_file.conf +++ b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_one_file.conf @@ -1,104 +1,84 @@ [config] -# List of applications to run - only RegridDataPlane for this case + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/RegridDataPlane/RegridDataPlane_multi_field_one_file.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 = RegridDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run - must match INIT_TIME_FMT INIT_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT INIT_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 1M -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 3H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# If True, run regrid_data_plane on observation data + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + OBS_REGRID_DATA_PLANE_RUN = True -# name of input field to process -# if unset, OBS_VAR1_NAME will be used -OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = APCP -OBS_REGRID_DATA_PLANE_VAR2_INPUT_FIELD_NAME = TMP +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst -# level of input field to process -# if unset, OBS_VAR1_LEVELS will be used -OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = L0 -OBS_REGRID_DATA_PLANE_VAR2_INPUT_LEVEL = L0 +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/RegridDataPlane/multi_field_one_file -# name of output field to create -# if unset, OBS_VAR1_NAME and OBS_VAR1_LEVELS will be combined to generate an output field name -OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = APCP_01 +OBS_REGRID_DATA_PLANE_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%2H}.tm00_G212 + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified REGRID_DATA_PLANE_ONCE_PER_FIELD = False -# If running a MET tool comparison tool after RegridDataPlane, one can instead set OBS_VAR1_[NAME/LEVELS] to -# a value that corresponds to the desired name/level to use in the comparison -# this value will be used to determine output name/level to pass to RegridDataPlane as well -#OBS_VAR1_NAME = APCP -#OBS_VAR1_LEVELS = A01 +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = APCP +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = L0 +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = APCP_01 -# Name to identify model data in output -MODEL = QPF +OBS_REGRID_DATA_PLANE_VAR2_INPUT_FIELD_NAME = TMP +OBS_REGRID_DATA_PLANE_VAR2_INPUT_LEVEL = L0 -# Name to identify observation data in output + +### +# RegridDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#regriddataplane +### + +MODEL = QPF OBTYPE = QPE -# Used by regrid_data_plane to remap data REGRID_DATA_PLANE_VERIF_GRID={INPUT_BASE}/met_test/data/sample_obs/ST2ml/ST2ml2005080703.Grb_G212 -# method to run regrid_data_plane, not setting this will default to NEAREST REGRID_DATA_PLANE_METHOD = BUDGET -# regridding width used in regrid_data_plane, not setting this will default to 1 REGRID_DATA_PLANE_WIDTH = 2 -# Gaussian filter DX value to add as command line argument - not added if unset or blank REGRID_DATA_PLANE_GAUSSIAN_DX = -# Gaussian filter radius value to add as command line argument - not added if unset or blank REGRID_DATA_PLANE_GAUSSIAN_RADIUS = - -# End of [config] section and start of [dir] section -[dir] -# directory containing observation input to RegridDataPlane -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst - -# directory to write observation output from RegridDataPlane -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/RegridDataPlane/multi_field_one_file - -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# template to use to read input data and write output data for RegridDataPlane -# if different names for input and output are desired, set OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE -# and OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE instead -OBS_REGRID_DATA_PLANE_TEMPLATE = {init?fmt=%Y%m%d%H}/wrfprs_ruc13_{lead?fmt=%2H}.tm00_G212 \ No newline at end of file diff --git a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_python_embedding.conf b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_python_embedding.conf index 4f0e6dd082..31b2944215 100644 --- a/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane_python_embedding.conf @@ -1,63 +1,76 @@ [config] -# List of applications to run + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/RegridDataPlane/RegridDataPlane_python_embedding.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 = RegridDataPlane -# time looping - options are INIT, VALID, RETRO, and REALTIME -LOOP_BY = INIT -# Format of INIT_BEG and INT_END -INIT_TIME_FMT = %Y%m%d%H +### +# 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 +### -# Start time for METplus run +LOOP_BY = INIT +INIT_TIME_FMT = %Y%m%d%H INIT_BEG=2005080700 - -# End time for METplus run INIT_END=2005080700 - -# Increment between METplus runs in seconds. Must be >= 60 INIT_INCREMENT=43200 -# List of forecast leads to process LEAD_SEQ = 3 -# Options are times, processes -# times = run all items in the PROCESS_LIST for a single initialization -# time, then repeat until all times have been evaluated. -# processes = run each item in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST. LOOP_ORDER = times -# run regrid_data_plane on observation data + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + OBS_REGRID_DATA_PLANE_RUN = True -# List of variables to compare -OBS_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS +OBS_REGRID_DATA_PLANE_INPUT_DIR = +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = PYTHON_NUMPY -OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = OBS +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/RegridDataPlane/regrid_py +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = numpy_data.nc + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified REGRID_DATA_PLANE_ONCE_PER_FIELD = True -# Name to identify model data in output -MODEL = FCST +OBS_VAR1_NAME = {INPUT_BASE}/met_test/scripts/python/read_ascii_numpy.py {INPUT_BASE}/met_test/data/python/obs.txt OBS +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = OBS -# Name to identify observation data in output + +### +# RegridDataPlane Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#regriddataplane +### + +MODEL = FCST OBTYPE = OBS -# Used by regrid_data_plane to remap data REGRID_DATA_PLANE_VERIF_GRID = G130 -# method to run regrid_data_plane, not setting this will default to NEAREST REGRID_DATA_PLANE_METHOD = BUDGET -# regridding width used in regrid_data_plane, not setting this will default to 1 REGRID_DATA_PLANE_WIDTH = 2 - -[dir] -OBS_REGRID_DATA_PLANE_INPUT_DIR = -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/RegridDataPlane/regrid_py - -[filename_templates] -OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = PYTHON_NUMPY -OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = numpy_data.nc \ No newline at end of file diff --git a/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis.conf b/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis.conf index d8270034e0..5d361be2be 100644 --- a/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis.conf +++ b/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis.conf @@ -1,11 +1,32 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis.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 = SeriesAnalysis + ### # 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 ### +SERIES_ANALYSIS_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID + LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG=2005080700 @@ -14,7 +35,6 @@ INIT_INCREMENT = 12H LEAD_SEQ = 12, 9, 6 -SERIES_ANALYSIS_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID SERIES_ANALYSIS_RUN_ONCE_PER_STORM_ID = False @@ -22,6 +42,7 @@ SERIES_ANALYSIS_CUSTOM_LOOP_LIST = ### # File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### FCST_SERIES_ANALYSIS_INPUT_DIR = {INPUT_BASE}/met_test/data/sample_fcst @@ -45,11 +66,9 @@ SERIES_ANALYSIS_CLIMO_STDEV_INPUT_TEMPLATE = ### # Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info ### -MODEL = WRF -OBTYPE = MC_PCP - #FCST_CAT_THRESH = #OBS_CAT_THRESH = @@ -61,10 +80,15 @@ OBS_VAR1_LEVELS = "(*,*)" BOTH_VAR1_THRESH = gt12.7, gt25.4, gt50.8, gt76.2 + ### -# SeriesAnalysis +# SeriesAnalysis Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#seriesanalysis ### +MODEL = WRF +OBTYPE = MC_PCP + #LOG_SERIES_ANALYSIS_VERBOSITY = 2 SERIES_ANALYSIS_CONFIG_FILE = {PARM_BASE}/met_config/SeriesAnalysisConfig_wrapped @@ -134,7 +158,7 @@ SERIES_ANALYSIS_OUTPUT_STATS_CNT = TOTAL, RMSE, FBAR, OBAR ### -# Plotting +# SeriesAnalysis Plotting ### SERIES_ANALYSIS_GENERATE_PLOTS = no @@ -142,4 +166,3 @@ SERIES_ANALYSIS_GENERATE_PLOTS = no PLOT_DATA_PLANE_TITLE = SERIES_ANALYSIS_GENERATE_ANIMATIONS = no - diff --git a/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis_python_embedding.conf b/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis_python_embedding.conf index 39e943fd57..097267655a 100644 --- a/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis_python_embedding.conf @@ -1,24 +1,82 @@ -# SeriesAnalysis using Python Embedding METplus Configuration - [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/SeriesAnalysis/SeriesAnalysis_python_embedding.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 = SeriesAnalysis -LOOP_ORDER = processes -LOOP_BY = INIT +### +# 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 +### -INIT_TIME_FMT = %Y%m%d%H +SERIES_ANALYSIS_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID +LOOP_BY = INIT +INIT_TIME_FMT = %Y%m%d%H INIT_BEG=2005080700 - INIT_END=2005080700 - INIT_INCREMENT = 12H LEAD_SEQ = 12 -SERIES_ANALYSIS_CUSTOM_LOOP_LIST = +LOOP_ORDER = processes + +SERIES_ANALYSIS_CUSTOM_LOOP_LIST = + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +FCST_SERIES_ANALYSIS_INPUT_DIR = {INPUT_BASE}/met_test/data/python +FCST_SERIES_ANALYSIS_INPUT_TEMPLATE = fcst.txt, fcst.txt +FCST_SERIES_ANALYSIS_INPUT_DATATYPE = PYTHON_NUMPY + +OBS_SERIES_ANALYSIS_INPUT_DIR = {INPUT_BASE}/met_test/data/python +OBS_SERIES_ANALYSIS_INPUT_TEMPLATE = obs.txt, obs.txt +OBS_SERIES_ANALYSIS_INPUT_DATATYPE = PYTHON_NUMPY + +SERIES_ANALYSIS_CLIMO_MEAN_INPUT_DIR = +SERIES_ANALYSIS_CLIMO_MEAN_INPUT_TEMPLATE = + +SERIES_ANALYSIS_CLIMO_STDEV_INPUT_DIR = +SERIES_ANALYSIS_CLIMO_STDEV_INPUT_TEMPLATE = + +SERIES_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/SeriesAnalysis +SERIES_ANALYSIS_OUTPUT_TEMPLATE = python_sa.nc + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +FCST_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST + +OBS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG OBS + + +### +# SeriesAnalysis Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#seriesanalysis +### SERIES_ANALYSIS_DESC = @@ -36,15 +94,13 @@ SERIES_ANALYSIS_REGRID_WIDTH = SERIES_ANALYSIS_REGRID_VLD_THRESH = SERIES_ANALYSIS_REGRID_SHAPE = -SERIES_ANALYSIS_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID - SERIES_ANALYSIS_RUN_ONCE_PER_STORM_ID = False #LOG_SERIES_ANALYSIS_VERBOSITY = 2 SERIES_ANALYSIS_IS_PAIRED = False -SERIES_ANALYSIS_CONFIG_FILE = {CONFIG_DIR}/SeriesAnalysisConfig_wrapped +SERIES_ANALYSIS_CONFIG_FILE = {PARM_BASE}/met_config/SeriesAnalysisConfig_wrapped SERIES_ANALYSIS_STAT_LIST = TOTAL, RMSE, FBAR, OBAR @@ -52,36 +108,3 @@ MODEL = PYTHON OBTYPE = ANALYS -FCST_SERIES_ANALYSIS_INPUT_DATATYPE = PYTHON_NUMPY - -OBS_SERIES_ANALYSIS_INPUT_DATATYPE = PYTHON_NUMPY - -FCST_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG FCST - -OBS_VAR1_NAME = {MET_INSTALL_DIR}/share/met/python/read_ascii_numpy.py MET_PYTHON_INPUT_ARG OBS - -[dir] - -CONFIG_DIR={PARM_BASE}/met_config - -FCST_SERIES_ANALYSIS_INPUT_DIR = {INPUT_BASE}/met_test/data/python - -OBS_SERIES_ANALYSIS_INPUT_DIR = {INPUT_BASE}/met_test/data/python - -SERIES_ANALYSIS_CLIMO_MEAN_INPUT_DIR = - -SERIES_ANALYSIS_CLIMO_STDEV_INPUT_DIR = - -SERIES_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/SeriesAnalysis - -[filename_templates] - -FCST_SERIES_ANALYSIS_INPUT_TEMPLATE = fcst.txt, fcst.txt - -OBS_SERIES_ANALYSIS_INPUT_TEMPLATE = obs.txt, obs.txt - -SERIES_ANALYSIS_OUTPUT_TEMPLATE = python_sa.nc - -SERIES_ANALYSIS_CLIMO_MEAN_INPUT_TEMPLATE = - -SERIES_ANALYSIS_CLIMO_STDEV_INPUT_TEMPLATE = diff --git a/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis.conf b/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis.conf index e3ccc5a964..67f5f0b4bd 100644 --- a/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis.conf +++ b/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis.conf @@ -1,91 +1,69 @@ -# StatAnalysis METplus Configuration - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# List of applications to run - only StatAnalysis for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/StatAnalysis/StatAnalysis.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 = StatAnalysis -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH +LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H - - -# Start time for METplus run - must match INIT_TIME_FMT VALID_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT VALID_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 12 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for StatAnalysis only -#LOG_STAT_ANALYSIS_VERBOSITY = 2 -# Models to process -# MODELn is the model name to filter for in -# stat files [required] -# MODELn_OBTYPE is the observation name -# to filter for the .stat files -# [required] -# MODELn_STAT_ANALYSIS_LOOKIN_DIR is the directory to search for -# the .stat files in, wildcards (*) -# are okay to search for multiple -# directories and templates like -# {valid?fmt=%Y%m%d%H%M%S} [required] -# MODELn_REFERENCE_NAME is a reference name for MODELn, defaults to -# MODELn, it can be used in the file template names -# [optional] +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + MODEL1 = WRF MODEL1_OBTYPE = ANALYS +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {INPUT_BASE}/met_test/out/grid_stat +MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = {fcst_valid_hour?fmt=%H}Z/{MODEL1}/{MODEL1}_{valid?fmt=%Y%m%d%H}.stat +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/stat_analysis +STAT_ANALYSIS_OUTPUT_TEMPLATE = job.out -# Location of MET config file to pass to StatAnalysis -# References CONFIG_DIR from the [dir] section -STAT_ANALYSIS_CONFIG_FILE = {CONFIG_DIR}/STATAnalysisConfig_wrapped + +### +# StatAnalysis Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#statanalysis +### + +#LOG_STAT_ANALYSIS_VERBOSITY = 2 + +STAT_ANALYSIS_CONFIG_FILE = {PARM_BASE}/met_config/STATAnalysisConfig_wrapped #STAT_ANALYSIS_HSS_EC_VALUE = -# stat_analysis job info STAT_ANALYSIS_JOB_NAME = filter -# if using -dump_row, put in JOBS_ARGS "-dump_row [dump_row_file]" -# if using -out_stat, put in JOBS_ARGS "-out_stat [out_stat_file]" -# METplus will fill in filename STAT_ANALYSIS_JOB_ARGS = -dump_row [dump_row_file] -# Optional variables for further filtering -# can be blank, single, or multiple values -# if more than one use comma separated list -# -# (FCST)(OBS)_(VALID)(INIT)_HOUR_LIST: HH format (ex. 00, 06, 12) -# (FCST)(OBS)_LEAD_LIST: HH[H][MMSS] format (ex. 00, 06, 120) MODEL_LIST = {MODEL1} DESC_LIST = FCST_LEAD_LIST = @@ -108,35 +86,6 @@ OBS_THRESH_LIST = COV_THRESH_LIST = ALPHA_LIST = LINE_TYPE_LIST = -# how to treat items listed in above _LIST variables -# GROUP_LIST_ITEMS: items listed in a given _LIST variable -# will be grouped together -# LOOP_LIST_ITEMS: items listed in a give _LIST variable -# will be looped over -# if not listed METplus will treat the list as a group + GROUP_LIST_ITEMS = FCST_INIT_HOUR_LIST LOOP_LIST_ITEMS = FCST_VALID_HOUR_LIST, MODEL_LIST - - -MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {INPUT_BASE}/met_test/out/grid_stat - -# Output data directory -STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/stat_analysis - -STAT_ANALYSIS_OUTPUT_TEMPLATE = job.out - -# location of configuration files used by MET applications -CONFIG_DIR = {PARM_BASE}/met_config - - -# Optional settings to create templated directory and file name information -# to save files as stat_analysis output as, this is appended to STAT_ANALYSIS_OUTPUT_DIR -# if no template is provided a default filename set in the code will be used -# Use: -# string templates can be set for all the lists being looped over, just -# use and a lower case version of the list, ex. {fcst_valid_hour?fmt=%H} -# or {fcst_var?fmt=%s} -# For looping over models: -# can set MODELn_STAT_ANALYSIS_[DUMP_ROW/OUT_STAT]_TEMPLATE for individual models -# or STAT_ANALYSIS_[DUMP_ROW/OUT_STAT] with {model?fmt=%s} -MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = {fcst_valid_hour?fmt=%H}Z/{MODEL1}/{MODEL1}_{valid?fmt=%Y%m%d%H}.stat diff --git a/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis_python_embedding.conf b/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis_python_embedding.conf index c1daba2380..72cfdee349 100644 --- a/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis_python_embedding.conf +++ b/parm/use_cases/met_tool_wrapper/StatAnalysis/StatAnalysis_python_embedding.conf @@ -1,89 +1,65 @@ -# StatAnalysis METplus Configuration - -# section heading for [config] variables - all items below this line and -# before the next section heading correspond to the [config] section [config] -# List of applications to run - only StatAnalysis for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/StatAnalysis/StatAnalysis_python_embedding.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 = StatAnalysis -# time looping - options are INIT, VALID, RETRO, and REALTIME + +### +# 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 - -# Format of INIT_BEG and INT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH VALID_TIME_FMT = %Y%m%d%H - - -# Start time for METplus run - must match INIT_TIME_FMT VALID_BEG=2005080700 - -# End time for METplus run - must match INIT_TIME_FMT VALID_END=2005080700 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 12 -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run LOOP_ORDER = times -# Verbosity of MET output - overrides LOG_VERBOSITY for StatAnalysis only -#LOG_STAT_ANALYSIS_VERBOSITY = 2 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Models to process -# MODELn is the model name to filter for in -# stat files [required] -# MODELn_OBTYPE is the observation name -# to filter for the .stat files -# [required] -# MODELn_STAT_ANALYSIS_LOOKIN_DIR is the directory to search for -# the .stat files in, wildcards (*) -# are okay to search for multiple -# directories and templates like -# {valid?fmt=%Y%m%d%H%M%S} [required] -# MODELn_REFERENCE_NAME is a reference name for MODELn, defaults to -# MODELn, it can be used in the file template names -# [optional] MODEL1 = WRF MODEL1_OBTYPE = ADPSFC +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = python {INPUT_BASE}/met_test/scripts/python/read_ascii_mpr.py {INPUT_BASE}/met_test/new/point_stat_120000L_20050807_120000V.stat +MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = stat_analysis_python_AGGR_MPR_to_SL1L2.stat +MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE = {model?fmt=%s}_{obtype?fmt=%s}_valid{valid?fmt=%Y%m%d}_fcstvalidhour{valid_hour?fmt=%H}0000Z_out_stat.stat + +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/StatAnalysis_python_embedding + +### +# StatAnalysis Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#statanalysis +### + +#LOG_STAT_ANALYSIS_VERBOSITY = 2 -# Location of MET config file to pass to StatAnalysis -# References CONFIG_DIR from the [dir] section -STAT_ANALYSIS_CONFIG_FILE = {CONFIG_DIR}/STATAnalysisConfig_wrapped +STAT_ANALYSIS_CONFIG_FILE = {PARM_BASE}/met_config/STATAnalysisConfig_wrapped -# stat_analysis job info STAT_ANALYSIS_JOB_NAME = aggregate_stat -# if using -dump_row, put in JOBS_ARGS "-dump_row [dump_row_file]" -# if using -out_stat, put in JOBS_ARGS "-out_stat [out_stat_file]" -# METplus will fill in filename STAT_ANALYSIS_JOB_ARGS = -out_line_type sl1l2 -by FCST_VAR -out_stat [out_stat_file] -# Optional variables for further filtering -# can be blank, single, or multiple values -# if more than one use comma separated list -# -# (FCST)(OBS)_(VALID)(INIT)_HOUR_LIST: HH format (ex. 00, 06, 12) -# (FCST)(OBS)_LEAD_LIST: HH[H][MMSS] format (ex. 00, 06, 120) MODEL_LIST = {MODEL1} DESC_LIST = FCST_LEAD_LIST = @@ -106,40 +82,6 @@ OBS_THRESH_LIST = COV_THRESH_LIST = ALPHA_LIST = LINE_TYPE_LIST = MPR -# how to treat items listed in above _LIST variables -# GROUP_LIST_ITEMS: items listed in a given _LIST variable -# will be grouped together -# LOOP_LIST_ITEMS: items listed in a give _LIST variable -# will be looped over -# if not listed METplus will treat the list as a group + GROUP_LIST_ITEMS = FCST_INIT_HOUR_LIST LOOP_LIST_ITEMS = FCST_VALID_HOUR_LIST, MODEL_LIST - - -# End of [config] section and start of [dir] section -[dir] - -MODEL1_STAT_ANALYSIS_LOOKIN_DIR = python {INPUT_BASE}/met_test/scripts/python/read_ascii_mpr.py {INPUT_BASE}/met_test/new/point_stat_120000L_20050807_120000V.stat - -# Output data directory -STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/StatAnalysis_python_embedding - -# location of configuration files used by MET applications -CONFIG_DIR = {PARM_BASE}/met_config - - -# End of [dir] section and start of [filename_templates] section -[filename_templates] -# Optional settings to create templated directory and file name information -# to save files as stat_analysis output as, this is appended to STAT_ANALYSIS_OUTPUT_DIR -# if no template is provided a default filename set in the code will be used -# Use: -# string templates can be set for all the lists being looped over, just -# use and a lower case version of the list, ex. {fcst_valid_hour?fmt=%H} -# or {fcst_var?fmt=%s} -# For looping over models: -# can set MODELn_STAT_ANALYSIS_[DUMP_ROW/OUT_STAT]_TEMPLATE for individual models -# or STAT_ANALYSIS_[DUMP_ROW/OUT_STAT] with {model?fmt=%s} -MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = stat_analysis_python_AGGR_MPR_to_SL1L2.stat - -MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE = {model?fmt=%s}_{obtype?fmt=%s}_valid{valid?fmt=%Y%m%d}_fcstvalidhour{valid_hour?fmt=%H}0000Z_out_stat.stat diff --git a/parm/use_cases/met_tool_wrapper/TCGen/TCGen.conf b/parm/use_cases/met_tool_wrapper/TCGen/TCGen.conf index 4fb7456019..8d25a7feaa 100644 --- a/parm/use_cases/met_tool_wrapper/TCGen/TCGen.conf +++ b/parm/use_cases/met_tool_wrapper/TCGen/TCGen.conf @@ -1,33 +1,50 @@ [config] -# Looping by times: steps through each 'task' in the PROCESS_LIST for each -# defined time, and repeats until all times have been evaluated. -LOOP_ORDER = times +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/TCGen/TCGen.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 +### -# 'Tasks' to be run PROCESS_LIST = TCGen + +### +# 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 = INIT -# The init time INIT_TIME_FMT = %Y INIT_BEG = 2016 +LEAD_SEQ = -LOG_TC_GEN_VERBOSITY = 2 - -# optional list of strings to loop over and call the tool multiple times -# value of each item can be referenced in filename templates with {custom?fmt=%s} TC_GEN_CUSTOM_LOOP_LIST = +LOOP_ORDER = times + -# I/O Configurations +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Location of input data directory for track data TC_GEN_TRACK_INPUT_DIR = {INPUT_BASE}/met_test/tc_data/genesis/atcf TC_GEN_TRACK_INPUT_TEMPLATE = {init?fmt=%Y}/*.dat -# Location of input data directory for genesis data TC_GEN_GENESIS_INPUT_DIR = {INPUT_BASE}/met_test/tc_data/genesis/suite1 TC_GEN_GENESIS_INPUT_TEMPLATE = {init?fmt=%Y}*/genesis*{init?fmt=%Y}* @@ -37,26 +54,30 @@ TC_GEN_GENESIS_INPUT_TEMPLATE = {init?fmt=%Y}*/genesis*{init?fmt=%Y}* #TC_GEN_SHAPE_INPUT_DIR = #TC_GEN_SHAPE_INPUT_TEMPLATE = - -# directory to write output files generated by tc_gen TC_GEN_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/TCGen TC_GEN_OUTPUT_TEMPLATE = tc_gen_{init?fmt=%Y} -# MET Configurations +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### -TC_GEN_CONFIG_FILE = {PARM_BASE}/met_config/TCGenConfig_wrapped -# The following variables set values in the MET configuration file used by this example -# Leaving these values commented will use the value found in the default MET configuration file -# See the MET documentation for this tool for more information on the settings +### +# TCGen Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#tcgen +### + +#LOG_TC_GEN_VERBOSITY = 2 + +TC_GEN_CONFIG_FILE = {PARM_BASE}/met_config/TCGenConfig_wrapped TC_GEN_INIT_FREQ = 6 TC_GEN_VALID_FREQ = 6 TC_GEN_FCST_HR_WINDOW_BEGIN = 6 - TC_GEN_FCST_HR_WINDOW_END = 120 TC_GEN_MIN_DURATION = 12 @@ -100,9 +121,6 @@ TC_GEN_VALID_END = TC_GEN_INIT_HOUR = -# sets METPLUS_LEAD in the wrapped MET config file -LEAD_SEQ = - TC_GEN_VX_MASK = TC_GEN_BASIN_MASK = diff --git a/parm/use_cases/met_tool_wrapper/TCMPRPlotter/TCMPRPlotter.conf b/parm/use_cases/met_tool_wrapper/TCMPRPlotter/TCMPRPlotter.conf index ccf92158fa..38a2046a4e 100644 --- a/parm/use_cases/met_tool_wrapper/TCMPRPlotter/TCMPRPlotter.conf +++ b/parm/use_cases/met_tool_wrapper/TCMPRPlotter/TCMPRPlotter.conf @@ -1,35 +1,55 @@ -# -# CONFIGURATION -# [config] -# Loop over each process in the process list (set in PROCESS_LIST) for all times in the time window of -# interest. -LOOP_ORDER = processes +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/TCMPRPlotter/TCMPRPlotter.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 = TCMPRPlotter -# The init time begin and end times, increment + +### +# 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 = INIT INIT_TIME_FMT = %Y%m INIT_BEG = 201503 INIT_END = 201503 - -# This is the step-size. Increment in seconds from the begin time to the end -# time INIT_INCREMENT = 6H +LOOP_ORDER = processes + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + TCMPR_PLOTTER_TCMPR_DATA_DIR = {INPUT_BASE}/met_test/tc_pairs/{date?fmt=%Y%m} TCMPR_PLOTTER_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/tcmpr_plots -#TCMPR_PLOTTER_READ_ALL_FILES = True -# Plot_TCMPR options, if left unset, default values that are -# pre-defined in the R utility (packaged with MET) will be used. +### +# TCMPRPlotter Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#tcmprplotter +### + +#TCMPR_PLOTTER_READ_ALL_FILES = True -# Config file used to customize the plot, the tcmpr_customize.conf -# file is used to resize the plot that is produced so that it doesn't -# fill the entire screen. TCMPR_PLOTTER_CONFIG_FILE = {PARM_BASE}/use_cases/met_tool_wrapper/TCMPRPlotter/TCMPRPlotterConfig_Customize TCMPR_PLOTTER_PREFIX = TCMPR_PLOTTER_TITLE = @@ -39,10 +59,9 @@ TCMPR_PLOTTER_YLAB = Your y-label Goes Here TCMPR_PLOTTER_XLIM = TCMPR_PLOTTER_YLIM = TCMPR_PLOTTER_FILTER = -# The tcst data file to be used instead of running the MET tc_stat tool + TCMPR_PLOTTER_FILTERED_TCST_DATA_FILE = -# Comma separated, no whitespace. Default is TK_ERR (track error) unless -# otherwise indicated. + TCMPR_PLOTTER_DEP_VARS = AMSLP-BMSLP,AMAX_WIND-BMAX_WIND,TK_ERR TCMPR_PLOTTER_SCATTER_X = TCMPR_PLOTTER_SCATTER_Y = @@ -51,8 +70,7 @@ TCMPR_PLOTTER_SERIES = TCMPR_PLOTTER_SERIES_CI = TCMPR_PLOTTER_LEGEND = TCMPR_PLOTTER_LEAD = -# Default plot is boxplot, unless otherwise indicated. If box plot is needed -# in addition to other plots, this needs to be indicated. + TCMPR_PLOTTER_PLOT_TYPES = MEAN, MEDIAN TCMPR_PLOTTER_RP_DIFF = TCMPR_PLOTTER_DEMO_YR = @@ -61,7 +79,6 @@ TCMPR_PLOTTER_FOOTNOTE_FLAG = TCMPR_PLOTTER_PLOT_CONFIG_OPTS = TCMPR_PLOTTER_SAVE_DATA = -# TCMPR FLAGS no == (don't set flag), yes == (set flag) TCMPR_PLOTTER_NO_EE = no TCMPR_PLOTTER_NO_LOG = no TCMPR_PLOTTER_SAVE = no diff --git a/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_extra_tropical.conf b/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_extra_tropical.conf index 255d41c784..593970cced 100644 --- a/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_extra_tropical.conf +++ b/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_extra_tropical.conf @@ -1,22 +1,42 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/TCPairs/TCPairs_extra_tropical.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 = TCPairs + ### # 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2014121318 INIT_END = 2014121318 -INIT_INCREMENT = 21600 ;; set to every 6 hours=21600 seconds +INIT_INCREMENT = 21600 TC_PAIRS_RUN_ONCE = True ### # File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### TC_PAIRS_ADECK_INPUT_DIR = {INPUT_BASE}/met_test/new/track_data @@ -42,7 +62,8 @@ TC_PAIRS_REFORMAT_TYPE = SBU ### -# TCPairs +# TCPairs Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#tcpairs ### TC_PAIRS_CONFIG_FILE = {PARM_BASE}/met_config/TCPairsConfig_wrapped diff --git a/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_tropical.conf b/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_tropical.conf index 2812a0cc16..044712728f 100644 --- a/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_tropical.conf +++ b/parm/use_cases/met_tool_wrapper/TCPairs/TCPairs_tropical.conf @@ -1,9 +1,28 @@ [config] +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/TCPairs/TCPairs_tropical.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 = TCPairs + ### # 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 = INIT @@ -21,6 +40,7 @@ TC_PAIRS_RUN_ONCE = False ### # File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### TC_PAIRS_ADECK_INPUT_DIR = {INPUT_BASE}/met_test/new/hwrf/adeck @@ -41,7 +61,8 @@ TC_PAIRS_REFORMAT_DECK = no ### -# TCPairs +# TCPairs Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#tcpairs ### TC_PAIRS_CONFIG_FILE = {PARM_BASE}/met_config/TCPairsConfig_wrapped diff --git a/parm/use_cases/met_tool_wrapper/TCRMW/TCRMW.conf b/parm/use_cases/met_tool_wrapper/TCRMW/TCRMW.conf index 0ff87ebda6..e92c2ba534 100644 --- a/parm/use_cases/met_tool_wrapper/TCRMW/TCRMW.conf +++ b/parm/use_cases/met_tool_wrapper/TCRMW/TCRMW.conf @@ -1,33 +1,58 @@ -# -# CONFIGURATION -# [config] -# Looping by times: steps through each 'task' in the PROCESS_LIST for each -# defined time, and repeats until all times have been evaluated. -LOOP_ORDER = times +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/TCRMW/TCRMW.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 +### -# 'Tasks' to be run PROCESS_LIST = TCRMW -LOOP_BY = INIT -# The init time begin and end times, increment, and last init hour. +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2016092900 INIT_END = 2016092900 - -# This is the step-size. Increment in seconds from the begin time to the end time -# set to 6 hours = 21600 seconds INIT_INCREMENT = 21600 -LOG_TC_RMW_VERBOSITY = 2 +LOOP_ORDER = times -TC_RMW_CONFIG_FILE = {CONFIG_DIR}/TCRMWConfig_wrapped -MODEL = fv3 +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +TC_RMW_DECK_INPUT_DIR = {INPUT_BASE}/met_test/new/tc_data/adeck +TC_RMW_DECK_TEMPLATE = aal14{date?fmt=%Y}_short.dat + +TC_RMW_INPUT_DIR = {INPUT_BASE}/met_test/new/model_data/grib2/gfs_fv3 +TC_RMW_INPUT_TEMPLATE = gfs.subset.t00z.pgrb2.0p25.f* + +TC_RMW_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/TCRMW +TC_RMW_OUTPUT_TEMPLATE = tc_rmw_aal14{date?fmt=%Y}.nc -#TC_RMW_DESC = + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### BOTH_VAR1_NAME = PRMSL BOTH_VAR1_LEVELS = L0 @@ -35,10 +60,20 @@ BOTH_VAR1_LEVELS = L0 BOTH_VAR2_NAME = TMP BOTH_VAR2_LEVELS = P1000, P900, P800, P700, P500, P100 -# The following variables set values in the MET -# configuration file used by this example -# Leaving these values commented will use the value -# found in the default MET configuration file + +### +# TCRMW Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#tcrmw +### + +#LOG_TC_RMW_VERBOSITY = 2 + +TC_RMW_CONFIG_FILE = {PARM_BASE}/met_config/TCRMWConfig_wrapped + +MODEL = fv3 + +#TC_RMW_DESC = + #TC_RMW_REGRID_METHOD = NEAREST #TC_RMW_REGRID_WIDTH = 1 #TC_RMW_REGRID_VLD_THRESH = 0.5 @@ -60,29 +95,3 @@ TC_RMW_CYCLONE = 14 #TC_RMW_VALID_INCLUDE_LIST = #TC_RMW_VALID_EXCLUDE_LIST = #TC_RMW_VALID_HOUR_LIST = - -# -# DIRECTORIES -# -[dir] - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/met_config - -# Location of input track data directory for DECK data -#TC_RMW_DECK_INPUT_DIR = /d1/projects/MET/MET_test_data/unit_test/tc_data/adeck -TC_RMW_DECK_INPUT_DIR = {INPUT_BASE}/met_test/new/tc_data/adeck - -#TC_RMW_INPUT_DIR = /d1/projects/MET/MET_test_data/unit_test/model_data/grib2/gfs_fv3 -TC_RMW_INPUT_DIR = {INPUT_BASE}/met_test/new/model_data/grib2/gfs_fv3 - -TC_RMW_OUTPUT_DIR = {OUTPUT_BASE}/met_tool_wrapper/TCRMW - -[filename_templates] -#TC_RMW_DECK_TEMPLATE = a{basin?fmt=%s}{cyclone?fmt=%s}{date?fmt=%Y}.dat -TC_RMW_DECK_TEMPLATE = aal14{date?fmt=%Y}_short.dat - -#TC_RMW_INPUT_TEMPLATE = gfs.t00z.pgrb2.0p25.f144 -TC_RMW_INPUT_TEMPLATE = gfs.subset.t00z.pgrb2.0p25.f* - -TC_RMW_OUTPUT_TEMPLATE = tc_rmw_aal14{date?fmt=%Y}.nc diff --git a/parm/use_cases/met_tool_wrapper/TCStat/TCStat.conf b/parm/use_cases/met_tool_wrapper/TCStat/TCStat.conf index 4fae5a9f7c..d791c3ffeb 100644 --- a/parm/use_cases/met_tool_wrapper/TCStat/TCStat.conf +++ b/parm/use_cases/met_tool_wrapper/TCStat/TCStat.conf @@ -1,75 +1,59 @@ -# -# CONFIGURATION -# [config] -# set looping method to processes-each 'task' in the process list runs to -# completion (for all init times) before the next 'task' is run -LOOP_ORDER = processes -# List of 'tasks' to run +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/TCStat/TCStat.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 = TCStat -LOOP_BY = INIT -# The init time begin and end times, increment, and last init hour. +### +# 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 = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2019103112 INIT_END = 2019103112 - -# This is the step-size. Increment in seconds from the begin time to the end time -# set to 6 hours = 21600 seconds INIT_INCREMENT = 6H -# -# DIRECTORIES -# -# TC-Stat input data (-lookin argument) -# uses output from tc-pairs -TC_STAT_LOOKIN_DIR = {INPUT_BASE}/met_test/tc_pairs +LOOP_ORDER = processes -# TC-Stat output data (creates .tcst ASCII files which can be read or used as -# input to TCMPR_Plotter_wrapper (the Python wrapper to plot_tcmpr.R) to create plots. -TC_STAT_OUTPUT_DIR = {OUTPUT_BASE}/tc_stat -TC_STAT_OUTPUT_TEMPLATE = job.out +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### -# Leave blank or remove to use wrapped config file in parm/met_config -TC_STAT_CONFIG_FILE = {PARM_BASE}/met_config/TCStatConfig_wrapped +TC_STAT_LOOKIN_DIR = {INPUT_BASE}/met_test/tc_pairs +TC_STAT_OUTPUT_DIR = {OUTPUT_BASE}/tc_stat +TC_STAT_OUTPUT_TEMPLATE = job.out -# !!!!!!!IMPORTANT!!!!!! -# Please refer to the README_TC located in ${MET_INSTALL_DIR}/share/met/config -# for details on setting up your analysis jobs. -# For arithmetic expressions such as: -# -column 'ABS(AMSLP-BMSLP)', enclose the expression in ''. Notice that there are no -# whitespaces within the arithmetic expression. White spaces are to be used to -# separate options from values (e.g. -job summary -by AMODEL,LEAD,AMSLP -init_hour 00 -column 'AMSLP-BMSLP'). -# eg. -lookin {OUTPUT_BASE}/tc_pairs -job filter -dump_row {OUTPUT_BASE}/tc_stat_filter.out -basin ML -init_hr 00 -# or -lookin {OUTPUT_BASE}/tc_pairs -job summary -by AMODEL,LEAD -column AMSLP -column AMAX_WIND -column 'ABS(AMAX_WIND-BMAX_WIND)' -out {OUTPUT_BASE}/tc_stat/tc_stat_summary.tcst +### +# TCStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#tcstat +### -# Define the job filter via TC_STAT_JOB_ARGS. -# Separate each option and value with whitespace, and each job with a whitespace. -# No whitespace within arithmetic expressions or lists of items -# (e.g. -by AMSLP,AMODEL,LEAD -column '(AMAX_WIND-BMAX_WIND)') -# Enclose your arithmetic expressions with '' and separate each job -# by whitespace: -# -job filter -dump_row /path/to, -job summary -line_type TCMPR -column 'ABS(AMAX_WIND-BMAX_WIND)' -out {OUTPUT_BASE}/tc_stat/file.tcst +TC_STAT_CONFIG_FILE = {PARM_BASE}/met_config/TCStatConfig_wrapped TC_STAT_JOB_ARGS = -job summary -line_type TCMPR -column 'ASPEED' -dump_row {TC_STAT_OUTPUT_DIR}/tc_stat_summary.tcst - -# -# FILL in the following values if running multiple jobs which -# requires a MET tc_stat config file. -# -# These all map to the options in the default TC-Stat config file, except these -# are pre-pended with TC_STAT to avoid clashing with any other similarly -# named options from other MET tools (eg TC_STAT_AMODEL corresponds to the -# amodel option in the default MET tc-stat config file, whereas AMODEL -# corresponds to the amodel option in the MET tc-pairs config file). - -# Stratify by these columns: TC_STAT_AMODEL = TC_STAT_BMODEL = TC_STAT_DESC = @@ -78,16 +62,12 @@ TC_STAT_BASIN = TC_STAT_CYCLONE = TC_STAT_STORM_NAME = -# Stratify by init times via a comma-separate list of init times to -# include or exclude. Time format defined as YYYYMMDD_HH or YYYYMMDD_HHmmss TC_STAT_INIT_BEG = 20150301 TC_STAT_INIT_END = 20150304 TC_STAT_INIT_INCLUDE = TC_STAT_INIT_EXCLUDE = TC_STAT_INIT_HOUR = 00 -# Stratify by valid times via a comma-separate list of valid times to -# include or exclude. Time format defined as YYYYMMDD_HH or YYYYMMDD_HHmmss TC_STAT_VALID_BEG = TC_STAT_VALID_END = TC_STAT_VALID_INCLUDE = @@ -97,58 +77,29 @@ TC_STAT_LEAD_REQ = TC_STAT_INIT_MASK = TC_STAT_VALID_MASK = -# Stratify by the valid time and lead time via comma-separated list of -# times in format HH[MMSS] -TC_STAT_VALID_HOUR = TC_STAT_LEAD = -# Stratify over the watch_warn column in the tcst file. Setting this to -# 'ALL' will match HUWARN, HUWATCH, TSWARN, TSWATCH TC_STAT_TRACK_WATCH_WARN = -# Stratify by applying thresholds to numeric data columns. Specify with -# comma-separated list of column names and thresholds to be applied. -# The length of TC_STAT_COLUMN_THRESH_NAME should be the same as -# TC_STAT_COLUMN_THRESH_VAL. TC_STAT_COLUMN_THRESH_NAME = TC_STAT_COLUMN_THRESH_VAL = -# Stratify by a list of comma-separated columns names and values corresponding -# to non-numeric data columns of the values of interest. TC_STAT_COLUMN_STR_NAME = TC_STAT_COLUMN_STR_VAL = -# Stratify by applying thresholds to numeric data columns only when lead=0. -# If lead=0 and the value does not meet the threshold, discard the entire -# track. The length of TC_STAT_INIT_THRESH_NAME must equal the length of -# TC_STAT_INIT_THRESH_VAL. TC_STAT_INIT_THRESH_NAME = TC_STAT_INIT_THRESH_VAL = -# Stratify by applying thresholds to numeric data columns only when lead = 0. -# If lead = 0 but the value doesn't meet the threshold, discard the entire -# track. TC_STAT_INIT_STR_NAME = TC_STAT_INIT_STR_VAL = -# Excludes any points where distance to land is <=0. When set to TRUE, once land -# is encountered, the remainder of the forecast track is NOT used for the -# verification, even if the track moves back over water. TC_STAT_WATER_ONLY = -# TRUE or FALSE. To specify whether only those track points occurring near -# landfall should be retained. Landfall is the last bmodel track point before -# the distance to land switches from water to land. TC_STAT_LANDFALL = -# Define the landfall retention window, which is defined as the hours offset -# from the time of landfall. Format is in HH[MMSS]. Default TC_STAT_LANDFALL_BEG -# is set to -24, and TC_STAT_LANDFALL_END is set to 00 TC_STAT_LANDFALL_BEG = -24 TC_STAT_LANDFALL_END = 00 -# Specify whether only those track points common to both the ADECK and BDECK -# tracks should be written out TC_STAT_MATCH_POINTS = false #TC_STAT_COLUMN_STR_EXC_NAME = @@ -156,6 +107,3 @@ TC_STAT_MATCH_POINTS = false #TC_STAT_INIT_STR_EXC_NAME = #TC_STAT_INIT_STR_EXC_VAL = - -# IMPORTANT Refer to the README_TC for details on setting up analysis -# jobs (located in {MET_INSTALL_DIR}/share/met/config diff --git a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once.conf b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once.conf index d0484030b4..036913a999 100644 --- a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once.conf +++ b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once.conf @@ -1,56 +1,57 @@ -# UserScript wrapper example - [config] -# List of applications to run - only UserScript for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/UserScript/UserScript_run_once.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 = UserScript -# time looping - options are INIT, VALID, RETRO, and REALTIME +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH -VALID_TIME_FMT = %Y%m%d%H%M%S +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -# Start time for METplus run - must match VALID_TIME_FMT +LOOP_BY = VALID +VALID_TIME_FMT = %Y%m%d%H%M%S VALID_BEG = 20141031093015 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 20141101093015 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0H, 12H, 15H, 24H, 120H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + LOOP_ORDER = processes -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} -USER_SCRIPT_CUSTOM_LOOP_LIST = nc -USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {INPUT_BASE}/met_test/new/test + +### +# UserScript Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#userscript +### + USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/met_tool_wrapper/UserScript/print_file_list.py diff --git a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_for_each.conf b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_for_each.conf index 9e6691ef1a..d135fa6be2 100644 --- a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_for_each.conf +++ b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_for_each.conf @@ -1,56 +1,57 @@ -# UserScript wrapper example - [config] -# List of applications to run - only UserScript for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/UserScript/UserScript_run_once_for_each.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 = UserScript -# time looping - options are INIT, VALID, RETRO, and REALTIME +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH -VALID_TIME_FMT = %Y%m%d%H%M%S +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_FOR_EACH -# Start time for METplus run - must match VALID_TIME_FMT +LOOP_BY = VALID +VALID_TIME_FMT = %Y%m%d%H%M%S VALID_BEG = 20141031093015 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 20141101093015 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0H, 12H, 24H, 120H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + LOOP_ORDER = processes -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} -USER_SCRIPT_CUSTOM_LOOP_LIST = nc -USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_FOR_EACH +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {INPUT_BASE}/met_test/new/test + +### +# UserScript Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#userscript +### + USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/met_tool_wrapper/UserScript/print_file_list.py diff --git a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_init.conf b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_init.conf index 15b484615c..dccb808ed6 100644 --- a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_init.conf +++ b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_init.conf @@ -1,56 +1,57 @@ -# UserScript wrapper example - [config] -# List of applications to run - only UserScript for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/UserScript/UserScript_run_once_per_init.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 = UserScript -# time looping - options are INIT, VALID, RETRO, and REALTIME +### +# 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 -LOOP_BY = INIT +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of INIT_BEG and INIT_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH -INIT_TIME_FMT = %Y%m%d%H%M%S +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID -# Start time for METplus run - must match VALID_TIME_FMT +LOOP_BY = INIT +INIT_TIME_FMT = %Y%m%d%H%M%S INIT_BEG = 20141031093015 - -# End time for METplus run - must match VALID_TIME_FMT INIT_END = 20141101093015 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds INIT_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0H, 12H, 24H, 120H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + LOOP_ORDER = processes -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} -USER_SCRIPT_CUSTOM_LOOP_LIST = nc -USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {INPUT_BASE}/met_test/new/test + +### +# UserScript Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#userscript +### + USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/met_tool_wrapper/UserScript/print_file_list.py diff --git a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_valid.conf b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_valid.conf index 28054b5c7a..89092717a4 100644 --- a/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_valid.conf +++ b/parm/use_cases/met_tool_wrapper/UserScript/UserScript_run_once_per_valid.conf @@ -1,57 +1,58 @@ -# UserScript wrapper example - [config] -# List of applications to run - only UserScript for this case +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/UserScript/UserScript_run_once_per_valid.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 = UserScript -# time looping - options are INIT, VALID, RETRO, and REALTIME +### +# 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 -LOOP_BY = VALID +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### -# Format of VALID_BEG and VALID_END using % items -# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. -# see www.strftime.org for more information -# %Y%m%d%H expands to YYYYMMDDHH -VALID_TIME_FMT = %Y%m%d%H%M%S +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID -# Start time for METplus run - must match VALID_TIME_FMT +LOOP_BY = VALID +VALID_TIME_FMT = %Y%m%d%H%M%S VALID_BEG = 20141031093015 - -# End time for METplus run - must match VALID_TIME_FMT VALID_END = 20141101093015 - -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds VALID_INCREMENT = 12H -# List of forecast leads to process for each run time (init or valid) -# In hours if units are not specified -# If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0H, 12H, 24H, 120H -# Order of loops to process data - Options are times, processes -# Not relevant if only one item is in the PROCESS_LIST -# times = run all wrappers in the PROCESS_LIST for a single run time, then -# increment the run time and run all wrappers again until all times have -# been evaluated. -# processes = run the first wrapper in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST until all -# wrappers have been run +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + LOOP_ORDER = processes -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} -USER_SCRIPT_CUSTOM_LOOP_LIST = nc -USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_INIT_OR_VALID +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### USER_SCRIPT_INPUT_TEMPLATE_LABELS = label0 USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {INPUT_BASE}/met_test/new/test + +### +# UserScript Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#userscript +### + USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/met_tool_wrapper/UserScript/print_file_list.py diff --git a/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf new file mode 100644 index 0000000000..2282808384 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile.conf @@ -0,0 +1,102 @@ +[config] + +PROCESS_LIST = GridStat + +### +# Time Info +### + +LOOP_BY = INIT +INIT_TIME_FMT = %Y%m%d%H +INIT_BEG=1982010100 +INIT_END=2010020100 +INIT_INCREMENT = 1Y + +LEAD_SEQ = + +LOOP_ORDER = processes + +### +# File I/O +### + + +FCST_GRID_STAT_INPUT_TEMPLATE = PYTHON_NUMPY + +OBS_GRID_STAT_INPUT_TEMPLATE = PYTHON_NUMPY + +GRID_STAT_CLIMO_MEAN_INPUT_DIR = +GRID_STAT_CLIMO_MEAN_INPUT_TEMPLATE = + +GRID_STAT_CLIMO_STDEV_INPUT_DIR = +GRID_STAT_CLIMO_STDEV_INPUT_TEMPLATE = + +GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/HSS_out_Mplus +GRID_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m} + + +### +# Field Info +### + +MODEL = CFSv2 +OBTYPE = OBS + +FCST_VAR1_NAME = {CONFIG_DIR}/forecast_read-in_CFSv2_categoricalthresholds.py {INPUT_BASE}/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/CFSv2.tmp2m.{init?fmt=%Y%m}.fcst.nc:tmp2m:{init?fmt=%Y%m%d%H}:0:0 +FCST_VAR1_LEVELS = +FCST_VAR1_THRESH = lt1.5, lt2.5 + +OBS_VAR1_NAME = {CONFIG_DIR}/forecast_read-in_CFSv2_categoricalthresholds_obs.py {INPUT_BASE}/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/CFSv2.tmp2m.{init?fmt=%Y%m}.fcst.nc:tmp2m:{init?fmt=%Y%m%d%H}:0:0 +OBS_VAR1_LEVELS = +OBS_VAR1_THRESH = lt1.5, lt2.5 + +CONFIG_DIR = {PARM_BASE}/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile + +### +# GridStat +### + + + +GRID_STAT_CONFIG_FILE = {PARM_BASE}/met_config/GridStatConfig_wrapped + + +GRID_STAT_REGRID_TO_GRID = FCST + + +GRID_STAT_DESC = NA + +FCST_GRID_STAT_FILE_WINDOW_BEGIN = 0 +FCST_GRID_STAT_FILE_WINDOW_END = 0 +OBS_GRID_STAT_FILE_WINDOW_BEGIN = 0 +OBS_GRID_STAT_FILE_WINDOW_END = 0 + +GRID_STAT_NEIGHBORHOOD_WIDTH = 1 +GRID_STAT_NEIGHBORHOOD_SHAPE = SQUARE + +GRID_STAT_NEIGHBORHOOD_COV_THRESH = >=0.5 + +GRID_STAT_ONCE_PER_FIELD = False + +FCST_IS_PROB = false + +FCST_GRID_STAT_PROB_THRESH = ==0.1 + +OBS_IS_PROB = false + +OBS_GRID_STAT_PROB_THRESH = ==0.1 + +GRID_STAT_OUTPUT_PREFIX = + + + +GRID_STAT_OUTPUT_FLAG_MCTC = BOTH +GRID_STAT_OUTPUT_FLAG_MCTS = BOTH + +GRID_STAT_NC_PAIRS_FLAG_LATLON = TRUE +GRID_STAT_NC_PAIRS_FLAG_RAW = TRUE +GRID_STAT_NC_PAIRS_FLAG_DIFF = TRUE + + +GRID_STAT_HSS_EC_VALUE = + diff --git a/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds.py b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds.py new file mode 100644 index 0000000000..cee496070e --- /dev/null +++ b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds.py @@ -0,0 +1,183 @@ + +import sys +import re +import numpy as np +import datetime as dt +from dateutil.relativedelta import * # New import +from netCDF4 import Dataset, chartostring +from preprocessFun_Modified import preprocess, dominant_tercile_fcst, dominant_tercile_obs, get_init_year # New import + +#grab input from user +#should be (1)input file using full path (2) variable name (3) valid time for the forecast in %Y%m%d%H%M format and (4) ensemble member number, all separated by ':' characters +#program can only accept that 1 input, while still maintaining user flexability to change multiple +#variables, including valid time, ens member, etc. +# Addition by Johnna - model, lead, init taken from file name +# Addition by Johnna - climatology and std dev caclulated for given lead, model, init +# Addition by Johnna - added command line pull for lead + +print('Type in input_file using full path:variable name:valid time in %Y%m%d%H%M:ensemble member number:lead') +# Example +# /cpc/nmme/CFSv2/hcst_new/010100/CFSv2.tmp2m.198201.fcst.nc:tmp2m:198201010101:0:0 + +input_file, var_name, init_time, ens_mem, lead = sys.argv[1].split(':') +ens_mem = int(ens_mem) +lead = int(lead) # Added by Johnna +init_time = dt.datetime.strptime(init_time,"%Y%m%d%H%M") + +# --- +# Added by Johnna +input_file_split = input_file.split('/') +#EDIT BY JOHN O +init_temp = "010100" +#init_temp = input_file_split[5] + +#fil_name = input_file_split[6] +fil_name = input_file +year_temp = fil_name.split('.') +#year = year_temp[2] +year = year_temp[-3] +print('YYYYMM: ' + str(year)) + +# Setup Climatology +#EDIT BY JOHN O +#model = input_file_split[3] +model = "CFSv2" +init = init_temp.replace('0100','') +lead = lead +clim_per = '1982_2010' +member = ens_mem +variable = var_name + +# Get path based on model (only works for this file name) +input_file_split2 = input_file.split(model + '.') +path = input_file_split2[0] + +# Calculate climatologies and standard deviations/etc. This calculates every time the loop runs (i.e. for each file read into MET) +# There might be a better positioning for this function such that it doesn't recalc each loop, but I pulled from the command line input +# above to create the function, so right now it has dependance on the file names/user input/etc. +# Fine for now since data are smallish, but if theres something higher res might slow things down. +print('Model: ' + model + ' Init: ' + str(init) + ' lead: ' + str(lead) + ' Member: ' + str(ens_mem) + ' Variable: ' + variable) + +# We only need the fcst_cat_thresh +# Commenting out the original preprocess function +#clim, stddev, anom, std_anom = preprocess(path, model, init, variable, lead, clim_per, member) + +# New preprocessing function to get the cat thresholds +# In order 0, 1, 2 where 0 is LT, 1 is MT, 2 is UT +# fcst_cat_thresh has ALL times (28), and is calculated for ALL 24 members +# So the array fcst_cat_thresh is time | 29, lat | 181, lon | 360) +# I wrote a clumsy function to split this into years based on the filename read in (get_init_year) +# But it works! Basically just a bunch of if statements like if the filename is 198201 then its index 0 of the array and so on to the last index +# I also swap the fcst lats to be -90 to 90 instead of 90 to -90 and match up the longitudes (theres a cyclic point in the fcst so its actually 361 pts) +fcst_cat_thresh = dominant_tercile_fcst(path, model, init, variable, clim_per, lead) +idx = get_init_year(year) +fcst_cat_thresh_1year = fcst_cat_thresh[idx,::-1,0:360] + +# Going to do the obs in the same wrapper. I realized this would be easier so I hope this is okay... I think its just a flag...? +# Using same clunky function to get the right year out of the big array +#EDIT BY JOHN O +obs_cat_thresh = dominant_tercile_obs(path) +obs_cat_thresh_1year = obs_cat_thresh[idx,:,0:360] + +# Redefine var_name to fcst (necessary for below) +var_name = 'fcst' +# --- + +try: + print('The file you are working on is: ' + input_file) + # all of this is actually pointless eexcept to get the dimensions and times, all of the calculations are done in the functions + #set pointers to file and group name in file + + f = Dataset(input_file) + v = f[var_name][member,lead,:,:] + + #grab data from file + lat = np.float64(f.variables['lat'][::-1]) + lon = np.float64(f.variables['lon'][:]) + + # Grab and format time, this is taken from the file name, which might not be the best way of doing it + # Can also potentially pull from the netCDF; but need an extra package in netCDF4 to do that, and its a little weird + # given units of months since. This was a bit easier. + # Do need to add relativedelta package but thats fairly common (its from dateutil) + val_time = init_time + relativedelta(months=lead) + print('Valid Time: ' + str(val_time)) + + + # Coming from the function + # uncomment out the obs one if you want to use the obs? + v = fcst_cat_thresh_1year + #v = obs_cat_thresh_1year + print('Shape of variable to read into MET: ' + str(v.shape)) + + # -------------------------- + # Commented out by Johnna, defined above in user input + # Print statement erroring so commented out + #grab intialization time from file name and hold + #also compute the lead time + #i_time_ind = input_file.split("_").index("aod.nc")-1 + #i_time = input_file.split("_")[i_time_ind] + #i_time_obj = dt.datetime.strptime(i_time,"%Y%m%d%H") + #lead, rem = divmod((val_time - i_time_obj).total_seconds(), 3600) + + #print("Ensemble Member evaluation for: "+f.members.split(',')[ens_mem]) + + #checks if the the valid time for the forecast from user is present in file. + #Exits if the time is not present with a message + #if not val_time.timestamp() in f['time'][:]: + # print("valid time of "+str(val_time)+" is not present. Check file initialization time, passed valid time.") + # f.close() + # sys.exit(1) + + #grab index in the time array for the valid time provided by user (val_time) + #val_time_ind = np.where(f['time'][:] == val_time.timestamp())[0][0] + #var = np.float64(v[val_time_ind:val_time_ind+1,ens_mem:ens_mem+1,::-1,:]) + # -------------------------- + + #squeeze out all 1d arrays, add fill value, convert to float64 + var = np.float64(v) + var[var < -800] = -9999 + + met_data = np.squeeze(var).copy() + #JOHN O ADDED TO TEST IF FLIPPING IS OCCURING + met_data = met_data[::-1,:] + met_data = np.nan_to_num(met_data, nan=-1) + print('Done, no exceptions') + +except NameError: + print("Can't find input file") + sys.exit(1) + +########## +#create a metadata dictionary + +attrs = { + + 'valid': str(val_time.strftime("%Y%m%d"))+'_'+str(val_time.strftime("%H%M%S")), + 'init': str(init_time.strftime("%Y%m%d"))+'_'+str(init_time.strftime("%H%M%S")), + 'name': var_name, + 'long_name': input_file, + 'lead': str(int(lead)), + 'accum': '00', + 'level': 'sfc', + 'units': 'Degrees K', + + 'grid': { + 'name': 'Global 1 degree', + 'type': 'LatLon', + 'lat_ll': -90.0, + 'lon_ll': 0.0, + 'delta_lat': 1.0, + 'delta_lon': 1.0, + + 'Nlon': f.dimensions['lon'].size, + 'Nlat': f.dimensions['lat'].size, + } + } + +#print some output to show script ran successfully +print("Input file: " + repr(input_file)) +print("Variable name: " + repr(var_name)) +print("valid time: " + repr(val_time.strftime("%Y%m%d%H%M"))) +print("Attributes:\t" + repr(attrs)) +f.close() + diff --git a/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds_obs.py b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds_obs.py new file mode 100644 index 0000000000..931115f68a --- /dev/null +++ b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/forecast_read-in_CFSv2_categoricalthresholds_obs.py @@ -0,0 +1,186 @@ + +import sys +import re +import numpy as np +import datetime as dt +from dateutil.relativedelta import * # New import +from netCDF4 import Dataset, chartostring +from preprocessFun_Modified import preprocess, dominant_tercile_fcst, dominant_tercile_obs, get_init_year # New import + +#grab input from user +#should be (1)input file using full path (2) variable name (3) valid time for the forecast in %Y%m%d%H%M format and (4) ensemble member number, all separated by ':' characters +#program can only accept that 1 input, while still maintaining user flexability to change multiple +#variables, including valid time, ens member, etc. +# Addition by Johnna - model, lead, init taken from file name +# Addition by Johnna - climatology and std dev caclulated for given lead, model, init +# Addition by Johnna - added command line pull for lead + +print('Type in input_file using full path:variable name:valid time in %Y%m%d%H%M:ensemble member number:lead') +# Example +# /cpc/nmme/CFSv2/hcst_new/010100/CFSv2.tmp2m.198201.fcst.nc:tmp2m:198201010101:0:0 + +input_file, var_name, init_time, ens_mem, lead = sys.argv[1].split(':') +ens_mem = int(ens_mem) +lead = int(lead) # Added by Johnna +init_time = dt.datetime.strptime(init_time,"%Y%m%d%H%M") + +# --- +# Added by Johnna +input_file_split = input_file.split('/') +#EDIT BY JOHN O +init_temp = "010100" +#init_temp = input_file_split[5] + +#fil_name = input_file_split[6] +fil_name = input_file +year_temp = fil_name.split('.') +#year = year_temp[2] +year = year_temp[-3] +print('YYYYMM: ' + str(year)) + +# Setup Climatology +#EDIT BY JOHN O +#model = input_file_split[3] +model = "CFSv2" +init = init_temp.replace('0100','') +lead = lead +clim_per = '1982_2010' +member = ens_mem +variable = var_name + +# Get path based on model (only works for this file name) +input_file_split2 = input_file.split(model + '.') +path = input_file_split2[0] + +# Calculate climatologies and standard deviations/etc. This calculates every time the loop runs (i.e. for each file read into MET) +# There might be a better positioning for this function such that it doesn't recalc each loop, but I pulled from the command line input +# above to create the function, so right now it has dependance on the file names/user input/etc. +# Fine for now since data are smallish, but if theres something higher res might slow things down. +print('Model: ' + model + ' Init: ' + str(init) + ' lead: ' + str(lead) + ' Member: ' + str(ens_mem) + ' Variable: ' + variable) + +# We only need the fcst_cat_thresh +# Commenting out the original preprocess function +#clim, stddev, anom, std_anom = preprocess(path, model, init, variable, lead, clim_per, member) + +# New preprocessing function to get the cat thresholds +# In order 0, 1, 2 where 0 is LT, 1 is MT, 2 is UT +# fcst_cat_thresh has ALL times (28), and is calculated for ALL 24 members +# So the array fcst_cat_thresh is time | 29, lat | 181, lon | 360) +# I wrote a clumsy function to split this into years based on the filename read in (get_init_year) +# But it works! Basically just a bunch of if statements like if the filename is 198201 then its index 0 of the array and so on to the last index +# I also swap the fcst lats to be -90 to 90 instead of 90 to -90 and match up the longitudes (theres a cyclic point in the fcst so its actually 361 pts) +fcst_cat_thresh = dominant_tercile_fcst(path, model, init, variable, clim_per, lead) +idx = get_init_year(year) +fcst_cat_thresh_1year = fcst_cat_thresh[idx,::-1,0:360] + +# Going to do the obs in the same wrapper. I realized this would be easier so I hope this is okay... I think its just a flag...? +# Using same clunky function to get the right year out of the big array +#EDIT BY JOHN O +obs_cat_thresh = dominant_tercile_obs(path) +obs_cat_thresh_1year = obs_cat_thresh[idx,:,0:360] + +# Redefine var_name to fcst (necessary for below) +var_name = 'fcst' +# --- + +try: + print('The file you are working on is: ' + input_file) + # all of this is actually pointless eexcept to get the dimensions and times, all of the calculations are done in the functions + #set pointers to file and group name in file + + f = Dataset(input_file) + v = f[var_name][member,lead,:,:] + + #grab data from file + lat = np.float64(f.variables['lat'][::-1]) + lon = np.float64(f.variables['lon'][:]) + + # Grab and format time, this is taken from the file name, which might not be the best way of doing it + # Can also potentially pull from the netCDF; but need an extra package in netCDF4 to do that, and its a little weird + # given units of months since. This was a bit easier. + # Do need to add relativedelta package but thats fairly common (its from dateutil) + val_time = init_time + relativedelta(months=lead) + print('Valid Time: ' + str(val_time)) + + + # Coming from the function + # uncomment out the obs one if you want to use the obs? + #v = fcst_cat_thresh_1year + v = obs_cat_thresh_1year + print('Shape of variable to read into MET: ' + str(v.shape)) + + # -------------------------- + # Commented out by Johnna, defined above in user input + # Print statement erroring so commented out + #grab intialization time from file name and hold + #also compute the lead time + #i_time_ind = input_file.split("_").index("aod.nc")-1 + #i_time = input_file.split("_")[i_time_ind] + #i_time_obj = dt.datetime.strptime(i_time,"%Y%m%d%H") + #lead, rem = divmod((val_time - i_time_obj).total_seconds(), 3600) + + #print("Ensemble Member evaluation for: "+f.members.split(',')[ens_mem]) + + #checks if the the valid time for the forecast from user is present in file. + #Exits if the time is not present with a message + #if not val_time.timestamp() in f['time'][:]: + # print("valid time of "+str(val_time)+" is not present. Check file initialization time, passed valid time.") + # f.close() + # sys.exit(1) + + #grab index in the time array for the valid time provided by user (val_time) + #val_time_ind = np.where(f['time'][:] == val_time.timestamp())[0][0] + #var = np.float64(v[val_time_ind:val_time_ind+1,ens_mem:ens_mem+1,::-1,:]) + # -------------------------- + + #squeeze out all 1d arrays, add fill value, convert to float64 + var = np.float64(v) + var[var < -800] = -9999 + + met_data = np.squeeze(var).copy() + #JOHN ADDED TO REMOVE EXTRA LON + #met_data = met_data[:,:-1] + #JOHN O ADDED TO FLIP OBS GRID + met_data = met_data[::-1,:] + met_data = np.nan_to_num(met_data, nan=-1) + print('Done, no exceptions') + print('New shape of variable to read into MET: ' + str(met_data.shape)) + +except NameError: + print("Can't find input file") + sys.exit(1) + +########## +#create a metadata dictionary + +attrs = { + + 'valid': str(val_time.strftime("%Y%m%d"))+'_'+str(val_time.strftime("%H%M%S")), + 'init': str(init_time.strftime("%Y%m%d"))+'_'+str(init_time.strftime("%H%M%S")), + 'name': var_name, + 'long_name': input_file, + 'lead': str(int(lead)), + 'accum': '00', + 'level': 'sfc', + 'units': 'Degrees K', + + 'grid': { + 'name': 'Global 1 degree', + 'type': 'LatLon', + 'lat_ll': -90.0, + 'lon_ll': 0.0, + 'delta_lat': 1.0, + 'delta_lon': 1.0, + + 'Nlon': 360, + 'Nlat': f.dimensions['lat'].size, + } + } + +#print some output to show script ran successfully +print("Input file: " + repr(input_file)) +print("Variable name: " + repr(var_name)) +print("valid time: " + repr(val_time.strftime("%Y%m%d%H%M"))) +print("Attributes:\t" + repr(attrs)) +f.close() + diff --git a/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/preprocessFun_Modified.py b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/preprocessFun_Modified.py new file mode 100644 index 0000000000..f4a638331a --- /dev/null +++ b/parm/use_cases/model_applications/s2s/GridStat_fcstCFSv2_obsGHCNCAMS_MultiTercile/preprocessFun_Modified.py @@ -0,0 +1,348 @@ + +# Functions to pre-process data + +def preprocess(path, model, init, variable, lead, clim_per, member): + import numpy as np + from netCDF4 import Dataset + + if clim_per == '1982_2010': + years = np.arange(1982,2011,1) + elif clim_per == '1991_2020': + years = np.arange(1991,2020,1) + else: + print('Check your climatology period') + + # Get the directory + dir = path + + # Make an empty array to store the climatology and SD (just store for 1 lead, 1 member) + full_fcst_array = np.zeros((len(years), 181, 360)) + anom = np.zeros((len(years), 181, 360)) + std_anom = np.zeros((len(years), 181, 360)) + clim = np.zeros((181, 360)) + stddev = np.zeros((181, 360)) + + for y in range(len(years)): + year = years[y] + # Can comment out if this bothers you + path = str(dir + model + '.' + variable + '.' + str(year) + str(init) + '.fcst.nc') + #print('Opening ' + path) + + dataset = Dataset(path) + # Shape of array before subset (24, 10, 181, 360) + fcst = dataset.variables['fcst'][member,lead,:,:] + #print(fcst.shape) + full_fcst_array[y,:,:] = fcst + + # Can comment out if this bothers you + #print('Shape of fcst array with all times: ' + str(full_fcst_array.shape)) + + # Define climatology for the lead and member of interest + clim = np.nanmean(full_fcst_array,axis=0) + + # Define standard deviation for the lead and member of interest + stddev = np.nanstd(full_fcst_array,axis=0) + + # Define anomalies and standardized anomalies (perhaps unnecessary) + for y in range(len(years)): + anom[y,:,:] = full_fcst_array[y,:,:] - clim + std_anom[y,:,:] = anom[y,:,:]/stddev + + return clim, stddev, anom, std_anom +# -------------------------------------------------------------------------------------------------- + +# -------------------------------------------------------------------------------------------------- +def dominant_tercile_fcst(path, model, init, variable, clim_per, lead): + + import numpy as np + member = 0 + members = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] + + nEns = len(members) + + # Make climos, std anoms, etc. from function for 1 member (to get shapes for empty variables) + clim, stddev, anom, std_anom = preprocess(path, model, init, variable, lead, clim_per, member) + + # Empty variables + std_anom_all = np.zeros((std_anom.shape[0], std_anom.shape[1], std_anom.shape[2], nEns)) + + for i in range(len(members)): + member = members[i] + clim, stddev, anom, std_anom = preprocess(path, model, init, variable, lead, clim_per, member) + std_anom_all[:, :, :, i] = std_anom + + ut_ones = np.where(std_anom_all[:,:,:,:] > 0.43,1,0) + lt_ones = np.where(std_anom_all[:,:,:,:] < -0.43,1,0) + mt_ones = np.where( (std_anom_all[:,:,:,:] > -0.43) & (std_anom_all[:,:,:,:] < 0.43),1,0) + + ut_prob = np.nansum(ut_ones,3)/len(members) + lt_prob = np.nansum(lt_ones,3)/len(members) + mt_prob = np.nansum(mt_ones,3)/len(members) + + # Put all in 1 array + all_probs = np.zeros((3, ut_prob.shape[0], ut_prob.shape[1], ut_prob.shape[2])) + + all_probs[0,:,:,:] = lt_prob + all_probs[1,:,:,:] = mt_prob + all_probs[2,:,:,:] = ut_prob + + + # Johnna's test statements: + #print('Model stuff') + #print(std_anom_all[0,50,100,:]) + + #print('lt') + #print(all_probs[0,:,50,100]) + + #print('mt') + #print(all_probs[1,:,50,100]) + + #print('ut') + #print(all_probs[2,:,50,100]) + + dominant_tercile = np.argmax(all_probs, axis=0) + + #print('dominant tercile') + #print(dominant_tercile[:,50,100]) + + temp = np.where(dominant_tercile == 2, 3., dominant_tercile) + temp = np.where(dominant_tercile == 1, 2., temp) + temp = np.where(dominant_tercile == 0, 1., temp) + + #print('temp') + #print(temp[:,50,100]) + + #cat_thresh_fcst = dominant_tercile + #cat_thresh_fcst = temp + + # Swap lats to match obs (will swap back later) + temp = temp[:,::-1,0:360] + # Mask according to obs: + # Note, will need to change path name here: + data_mask = mask(path) + + temp_masked = np.zeros((temp.shape[0], temp.shape[1], temp.shape[2])) + for i in range(0,temp.shape[0]): + #MODIFIED BY JOHN O, CHANGE NANS TO -9999s + temp_masked[i,:,:] = np.where(data_mask[:,0:360] == -9.99000000e+08, -9999, temp[i,:,:]) + + #print('temp masked') + #print(temp_masked[:,50,100]) + + cat_thresh_fcst = temp_masked[:,::-1,:] # MET function swaps lats to normal, putting this back into abnormal + + return cat_thresh_fcst +# -------------------------------------------------------------------------------------------------- + + + + +# -------------------------------------------------------------------------------------------------- +def dominant_tercile_obs(path_obs): + from netCDF4 import Dataset + import numpy as np + + # Read in obs data + obs_data = Dataset(path_obs + "ghcn_cams.1x1.1982-2020.mon.nc") + obs_clim_data = Dataset(path_obs + "ghcn_cams.1x1.1982-2010.mon.clim.nc") + obs_stddev_data = Dataset(path_obs + "ghcn_cams.1x1.1982-2010.mon.stddev.nc") + + + print('Note this function for obs is ONLY meant to be used for January monthly verification with a 1982-2010 base period') + obs_full = obs_data.variables['tmp2m'][:,:,:] + obs_clim = obs_clim_data.variables['clim'][0,:,:] + obs_stddev = obs_stddev_data.variables['stddev'][0,:,:] + + # Grab only Januaries + obs_jan_full = obs_full[::12,:,:] + + # For 1982-2010 + obs_jan = obs_jan_full[0:29,:,:] + + # Make std anoms + obs_std_anom = np.zeros((obs_jan.shape[0], obs_jan.shape[1], obs_jan.shape[2])) + + for t in range(0,obs_jan.shape[0]): + obs_std_anom[t,:,:] = (obs_jan[t,:,:] - obs_clim) / obs_stddev + + ut_obs_ones = np.where(obs_std_anom[:,:,:] > 0.43,3,0) + lt_obs_ones = np.where(obs_std_anom[:,:,:] < -0.43,1,0) + mt_obs_ones = np.where( (obs_std_anom[:,:,:] > -0.43) & (obs_std_anom[:,:,:] < 0.43),2,0) + + # Put all in 1 array + all_probs = np.zeros((3, ut_obs_ones.shape[0], ut_obs_ones.shape[1], ut_obs_ones.shape[2])) + + all_probs[0,:,:,:] = lt_obs_ones + all_probs[1,:,:,:] = mt_obs_ones + all_probs[2,:,:,:] = ut_obs_ones + + + # Johnna testing: + #print('obs stuff') + #print(obs_std_anom[:,100,50]) + + #print('lt') + #print(all_probs[0,:,100,50]) + + #print('mt') + #print(all_probs[1,:,100,50]) + + #print('ut') + #print(all_probs[2,:,100,50]) + + + # Mask according to obs: + # Note, will need to change path name here: + data_mask = mask(path_obs) + + temp1 = np.nansum(all_probs,axis=0) + temp = temp1[:,:,0:360] + #print(cat_thresh_obs[:, 100, 50]) + #print(np.nanmax(cat_thresh_obs)) + #print(np.nanmin(cat_thresh_obs)) + + temp_masked = np.zeros((temp.shape[0], temp.shape[1], temp.shape[2])) + for i in range(0,temp.shape[0]): + #MODIFIED BY JOHN O, CHANGE NANS TO -9999s + temp_masked[i,:,:] = np.where(data_mask[:,0:360] == -9.99000000e+08, -9999, temp[i,:,:]) + + cat_thresh_obs = temp_masked + + return cat_thresh_obs +# -------------------------------------------------------------------------------------------------- + + + + + + +# -------------------------------------------------------------------------------------------------- +def plot_bs(varObs, plotType): + import numpy as np + import matplotlib as mpl + mpl.use('Agg') + import matplotlib.pyplot as plt + from mpl_toolkits.basemap import Basemap + from matplotlib.colors import LinearSegmentedColormap, ListedColormap, BoundaryNorm + from matplotlib import ticker + + lats = np.arange(-90, 90, 1) + lons = np.arange(0, 360, 1) + lon, lat = np.meshgrid(lons, lats) + #clevs = [240, 250, 260, 270, 280, 290, 300] + #clevs = [-4.0, -3.0, -2.0, -1.0, -0.5, -0.25, 0.25, 0.5, 1.0, 2.0, 3.0, 4.0] + #clevs = [0.125, 0.25, 0.375, 0.5, 0.625, 0.755, 0.875] + #clevs = [0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9] + + if plotType == 'BS': + clevs = np.arange(0.025, 0.425, 0.025) + #print(clevs) + #clevs = [0.0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4] + elif plotType == 'BS_clim': + clevs = np.arange(0.025, 0.425, 0.025) + elif plotType == 'bs_py_min_met': + clevs = np.arange(-0.1, 0.1, 0.01) + elif plotType == 'bsc_py_min_met': + clevs = np.arange(-0.1, 0.1, 0.01) + else: + clevs = np.arange(-0.4, 0.4, 0.025) + if varObs == 'tmp2m': + myBlues = ['#5a00d2', '#3e9dff', '#30c6f3', '#00ffff', '#c7eab9'] + myReds = ['#f9e3b4', '#eeff41', '#ffc31b', '#e69138', '#c43307'] + else: + myBlues = ['#995005', '#da751f', '#e0a420', '#f9cb9c', '#f9e3b4'] + myReds = ['#5affd1', '#b3eaac', '#75e478', '#4db159', '#2e8065'] + myColors = myBlues+['white']+myReds + cmap = ListedColormap(myColors, 'mycmap', N = len(clevs)-1) + norm = BoundaryNorm(clevs, cmap.N) + m = Basemap(projection='mill', resolution='l', llcrnrlon=0, llcrnrlat= -90, + urcrnrlon=360, urcrnrlat = 90) + fig = plt.figure(figsize=(10,10)) + + return lats, lons, clevs, myBlues, myReds, myColors, cmap, norm, m, fig +# -------------------------------------------------------------------------------------------------- + + + +# -------------------------------------------------------------------------------------------------- +def get_init_year(year): + + # There is absolutely a better way to do this... + + if year == '198201': + idx = 0 + if year == '198301': + idx = 1 + if year == '198401': + idx = 2 + if year == '198501': + idx = 3 + if year == '198601': + idx = 4 + if year == '198701': + idx = 5 + if year == '198801': + idx = 6 + if year == '198901': + idx = 7 + if year == '199001': + idx = 8 + if year == '199101': + idx = 9 + if year == '199201': + idx = 10 + if year == '199301': + idx = 11 + if year == '199401': + idx = 12 + if year == '199501': + idx = 13 + if year == '199601': + idx = 14 + if year == '199701': + idx = 15 + if year == '199801': + idx = 16 + if year == '199901': + idx = 17 + if year == '200001': + idx = 18 + if year == '200101': + idx = 19 + if year == '200201': + idx = 20 + if year == '200301': + idx = 21 + if year == '200401': + idx = 22 + if year == '200501': + idx = 23 + if year == '200601': + idx = 24 + if year == '200701': + idx = 25 + if year == '200801': + idx = 26 + if year == '200901': + idx = 27 + if year == '201001': + idx = 28 + + return idx +# -------------------------------------------------------------------------------------------------- + + + + +# -------------------------------------------------------------------------------------------------- +def mask(path_obs): + import numpy as np + from netCDF4 import Dataset + obs_data = Dataset(path_obs + "ghcn_cams.1x1.1982-2020.mon.nc") + obs_mask_all = obs_data.variables['tmp2m'][::12,:,:] + obs_mask = obs_mask_all[0,:,0:360] + #print(obs_mask[:,100]) + obs_mask = np.where(obs_mask.all == '--', np.nan, obs_mask) + #print(obs_mask[:,100]) + return obs_mask +# -------------------------------------------------------------------------------------------------- diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.conf similarity index 90% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.conf index f207304e8d..d3b346a661 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking.conf @@ -48,19 +48,19 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mid_lat -OBS_ANOM_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly +OBS_ANOM_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly OBS_ANOM_INPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc OBS_ANOM_OUTPUT_DIR = {OBS_ANOM_INPUT_DIR} OBS_ANOM_OUTPUT_TEMPLATE = ERA_anom_files_lead{lead?fmt=%HHH}.txt -OBS_AVE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily +OBS_AVE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily OBS_AVE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_AVE_OUTPUT_DIR = {OBS_AVE_INPUT_DIR} OBS_AVE_OUTPUT_TEMPLATE = ERA_daily_files_lead{lead?fmt=%HHH}.txt -FCST_AVE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/GFS/Daily +FCST_AVE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/GFS/Daily FCST_AVE_INPUT_TEMPLATE = Z500_daily_{init?fmt=%Y%m%d}_{lead?fmt=%HHH}_NH.nc FCST_AVE_OUTPUT_DIR = {FCST_AVE_INPUT_DIR} FCST_AVE_OUTPUT_TEMPLATE = GFS_daily_files_lead{lead?fmt=%HHH}.txt @@ -114,7 +114,7 @@ REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ -FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Regrid +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Regrid # format of filenames # Input ERA Interim @@ -169,7 +169,7 @@ REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid # format of filenames # Input ERA Interim @@ -215,7 +215,7 @@ OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid OBS_PCP_COMBINE_OUTPUT_DIR = {OBS_AVE_INPUT_DIR} # Input ERA Interim @@ -265,8 +265,8 @@ OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Rmean5d # format of filenames # Input ERA Interim @@ -308,7 +308,7 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA OBS_PCP_COMBINE_OUTPUT_DIR = {OBS_ANOM_INPUT_DIR} # format of filenames @@ -332,7 +332,7 @@ VALID_INCREMENT = 86400 LEAD_SEQ = 0 # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Name of the file containing the listing of input files USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_CBL_INPUT @@ -406,10 +406,10 @@ FCST_BLOCK_METHOD = PH OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} # Location of output MPR files -BLOCKING_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/mpr +BLOCKING_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/mpr # Plots Output Dir -BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/plots +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/plots #CBL plot title and output namename OBS_CBL_PLOT_MTHSTR = DJF @@ -436,7 +436,7 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,0229" USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc,{INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/GFS/Daily/Z500_{init?fmt=%Y%m%d}_{lead?fmt=%HHH}_NH.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc,{INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/GFS/Daily/Z500_{init?fmt=%Y%m%d}_{lead?fmt=%HHH}_NH.nc # Name of the file containing the listing of input files # The options are OBS_CBL_INPUT, FCST_CBL_INPUT, OBS_IBL_INPUT, and FCST_IBL_INPUT @@ -444,7 +444,7 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcst USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_IBL_INPUT, FCST_IBL_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py # Stat Analysis for the IBLs @@ -494,10 +494,10 @@ LINE_TYPE_LIST = MPR GROUP_LIST_ITEMS = MODEL_LIST LOOP_LIST_ITEMS = FCST_LEAD_LIST -MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/mpr/IBL +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/mpr/IBL # Output data directory -STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking CONFIG_DIR = {PARM_BASE}/met_config @@ -561,10 +561,10 @@ LINE_TYPE_LIST = MPR GROUP_LIST_ITEMS = MODEL_LIST LOOP_LIST_ITEMS = FCST_LEAD_LIST -MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/mpr/Blocks +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/mpr/Blocks # Output data directory -STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking CONFIG_DIR = {PARM_BASE}/met_config diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.conf similarity index 90% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.conf index 02f48837cb..5a69011610 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime.conf @@ -48,7 +48,7 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,0229" LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mid_lat # Regridding Pre-Processing Step @@ -91,8 +91,8 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/OrigData -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/OrigData +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid # format of filenames # Input and output ERA Interim @@ -130,8 +130,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -194,10 +194,10 @@ OBS_WR_OUTPUT_FILE_TYPE = text OBS_WR_OUTPUT_FILE = obs_weather_regime_class FCST_WR_OUTPUT_FILE_TYPE = text FCST_WR_OUTPUT_FILE = fcst_weather_regime_class -WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime +WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime # Directory to send output plots -WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/plots/ +WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/plots/ # Elbow Plot Title and output file name OBS_ELBOW_PLOT_TITLE = ERA Elbow Method For Optimal k @@ -224,7 +224,7 @@ FCST_FREQ_PLOT_OUTPUT_NAME = fcst_freq # MPR file information MASK_NAME = FULL -WR_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/mpr +WR_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/mpr # Run the Weather Regime Script @@ -236,7 +236,7 @@ LEAD_SEQ = 24 USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc,{INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/GFS/Daily/Z500_{init?fmt=%Y%m%d}_{lead?fmt=%HHH}_NH.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc,{INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/GFS/Daily/Z500_{init?fmt=%Y%m%d}_{lead?fmt=%HHH}_NH.nc # Name of the file containing the listing of input files # The options are OBS_INPUT for observations or FCST_INPUT for forecast @@ -245,7 +245,7 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcst USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_INPUT, FCST_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py [sanal_wrclass] @@ -294,10 +294,10 @@ LINE_TYPE_LIST = MPR GROUP_LIST_ITEMS = MODEL_LIST LOOP_LIST_ITEMS = FCST_LEAD_LIST -MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/mpr/WeatherRegime +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/mpr/WeatherRegime # Output data directory -STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime CONFIG_DIR = {PARM_BASE}/met_config @@ -360,10 +360,10 @@ LINE_TYPE_LIST = MPR GROUP_LIST_ITEMS = MODEL_LIST LOOP_LIST_ITEMS = FCST_LEAD_LIST -MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/mpr/freq +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/mpr/freq # Output data directory -STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime CONFIG_DIR = {PARM_BASE}/met_config diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.conf similarity index 89% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.conf index 7d4bc1d83e..1b35aa2e51 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking.conf @@ -47,7 +47,7 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mid_lat # Run the obs data # A variable set to be used in the pre-processing steps @@ -89,7 +89,7 @@ REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid # format of filenames # Input ERA Interim @@ -128,8 +128,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # Input and output Data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily # Input and Output filename templates, ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -163,8 +163,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Rmean5d # format of filenames # Input ERA Interim @@ -188,8 +188,8 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly # format of filenames # Input ERA Interim @@ -249,7 +249,7 @@ OBS_BLOCK_TRAVEL = 45 OBS_BLOCK_METHOD = PH # Plot Output Directory -BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_Blocking/plots/ +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking/plots/ #CBL plot title and name OBS_CBL_PLOT_MTHSTR = DJF @@ -273,7 +273,7 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc,{INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc,{INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Name of the file containing the listing of input files # The options are OBS_CBL_INPUT, FCST_CBL_INPUT, OBS_IBL_INPUT, and FCST_IBL_INPUT @@ -281,4 +281,4 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcst USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_CBL_INPUT,OBS_IBL_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.conf similarity index 88% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.conf index 8b17e73718..6f1a60d786 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -47,7 +47,7 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mid_lat # Regridding Pre-Processing Step @@ -90,8 +90,8 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/OrigData -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/OrigData +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid # format of filenames # Input and output ERA Interim @@ -129,8 +129,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -174,10 +174,10 @@ OBS_WR_FREQ = 7 # Type options are text or netcdf OBS_WR_OUTPUT_FILE_TYPE = text OBS_WR_OUTPUT_FILE = obs_weather_regime_class -WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime +WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime # Directory to send output plots -WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/plots/ +WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/plots/ # Elbow Plot Title and output file name OBS_ELBOW_PLOT_TITLE = ERA Elbow Method For Optimal k @@ -197,7 +197,7 @@ OBS_FREQ_PLOT_OUTPUT_NAME = obs_freq # MPR file information MASK_NAME = FULL -WR_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/mpr +WR_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/mpr # Run the Weather Regime Script @@ -206,7 +206,7 @@ WR_MPR_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/mp USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Name of the file containing the listing of input files # The options are OBS_INPUT for observations or FCST_INPUT for forecast @@ -215,4 +215,4 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcst USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mid_lat/UserScript_fcstGFS_obsERA_WeatherRegime/WeatherRegime_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py rename to parm/use_cases/model_applications/s2s_mid_lat/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf b/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf similarity index 91% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf rename to parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf index 8ca46eba79..99fc2cc2a7 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI.conf +++ b/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI.conf @@ -43,7 +43,7 @@ LEAD_SEQ = 0 LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mjo # Run the obs for these cases OBS_RUN = True @@ -59,11 +59,11 @@ REGRID_DATA_PLANE_METHOD = NEAREST REGRID_DATA_PLANE_WIDTH = 1 # Input and Output Directories for the OBS OLR Files and output text file containing the file list -OBS_OLR_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/ERA/Regrid +OBS_OLR_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/ERA/Regrid OBS_OLR_INPUT_TEMPLATE = OLR_{valid?fmt=%Y%m%d}.nc # Input and Output Directories for the OBS OLR Files and output text file containing the file list -FCST_OLR_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/GFS/Regrid +FCST_OLR_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/GFS/Regrid FCST_OLR_INPUT_TEMPLATE = OLR_{valid?fmt=%Y%m%d}.nc @@ -81,7 +81,7 @@ FCST_PCP_COMBINE_COMMAND = -derive mean {FCST_PCP_COMBINE_INPUT_DIR}/{valid?fmt= FCST_PCP_COMBINE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds084.1 FCST_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/gfs.0p25.{init?fmt=%y%m%d%H}.f{lead?fmt=%HHH}.grib2 -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_OMI/GFS/daily_mean +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/GFS/daily_mean FCST_PCP_COMBINE_OUTPUT_TEMPLATE = GFS_mean_{valid?fmt=%Y%m%d}.nc @@ -108,7 +108,7 @@ OBS_REGRID_DATA_PLANE_VAR1_OPTIONS = file_type=NETCDF_NCCF; censor_thresh=eq-999 OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = olr # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/ERA/daily_mean +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/ERA/daily_mean OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OBS_OLR_INPUT_DIR} # format of filenames @@ -136,7 +136,7 @@ FCST_REGRID_DATA_PLANE_VAR1_LEVELS = "(*,*)" FCST_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = olr # input and output data directories for each application in PROCESS_LIST -FCST_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/GFS/daily_mean +FCST_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/GFS/daily_mean FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {FCST_OLR_INPUT_DIR} # format of filenames @@ -156,7 +156,7 @@ VALID_END = 2012123100 # Find the EOF files for each time # Filename templates for EOF1 and EOF2 -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/EOF/eof1/eof{valid?fmt=%j}.txt,{INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/EOF/eof2/eof{valid?fmt=%j}.txt +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/EOF/eof1/eof{valid?fmt=%j}.txt,{INPUT_BASE}/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/EOF/eof2/eof{valid?fmt=%j}.txt # Name of the file containing the listing of input files # The options are EOF1_INPUT and EOF2_INPUT @@ -182,7 +182,7 @@ OBS_PER_DAY = 1 # Output Directory for the plots # If not set, it this will default to {OUTPUT_BASE}/plots -OMI_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_OMI/plots +OMI_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/plots # Phase Plot start date, end date, output name, and format PHASE_PLOT_TIME_BEG = 2017010100 @@ -208,4 +208,4 @@ USER_SCRIPT_INPUT_TEMPLATE = {OBS_OLR_INPUT_DIR}/{OBS_OLR_INPUT_TEMPLATE},{FCST_ USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_OLR_INPUT,FCST_OLR_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py b/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py rename to parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/OMI_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/read_netcdf.yaml b/parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/read_netcdf.yaml similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_OMI/read_netcdf.yaml rename to parm/use_cases/model_applications/s2s_mjo/UserScript_fcstGFS_obsERA_OMI/read_netcdf.yaml diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf similarity index 91% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf index fff56cde25..19d97d361b 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf +++ b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI.conf @@ -43,7 +43,7 @@ LEAD_SEQ = 0 LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mjo # Run the obs for these cases OBS_RUN = True @@ -59,7 +59,7 @@ REGRID_DATA_PLANE_METHOD = NEAREST REGRID_DATA_PLANE_WIDTH = 1 # Input and Output Directories for the OBS OLR Files and output text file containing the file list -OBS_OLR_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/ERA +OBS_OLR_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/ERA OBS_OLR_INPUT_TEMPLATE = OLR_{valid?fmt=%Y%m%d}.nc @@ -84,7 +84,7 @@ OBS_REGRID_DATA_PLANE_VAR1_OPTIONS = file_type=NETCDF_NCCF; censor_thresh=eq-999 OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = olr # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_OMI +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OBS_OLR_INPUT_DIR} # format of filenames @@ -104,7 +104,7 @@ VALID_END = 2012123100 # Find the EOF files for each time # Filename templates for EOF1 and EOF2 -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/EOF/eof1/eof{valid?fmt=%j}.txt,{INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/EOF/eof2/eof{valid?fmt=%j}.txt +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/EOF/eof1/eof{valid?fmt=%j}.txt,{INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/EOF/eof2/eof{valid?fmt=%j}.txt # Name of the file containing the listing of input files # The options are EOF1_INPUT and EOF2_INPUT @@ -130,7 +130,7 @@ OBS_PER_DAY = 1 # Output Directory for the plots # If not set, it this will default to {OUTPUT_BASE}/plots -OMI_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_OMI/plots +OMI_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_OMI/plots # Phase Plot start date, end date, output name, and format PHASE_PLOT_TIME_BEG = 2012010100 @@ -154,4 +154,4 @@ USER_SCRIPT_INPUT_TEMPLATE = {OBS_OLR_INPUT_DIR}/{OBS_OLR_INPUT_TEMPLATE} USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_OLR_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/OMI_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/OMI_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/OMI_driver.py b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/OMI_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_OMI/OMI_driver.py rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_OMI/OMI_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf similarity index 86% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf index 7f435f4034..bb8168e9b4 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram.conf +++ b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram.conf @@ -41,7 +41,7 @@ LEAD_SEQ = 0 LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mjo # Run the obs for these cases OBS_RUN = True @@ -50,7 +50,7 @@ FCST_RUN = False # Input and Output Directories for the OBS OLR Files and output text file containing the file list OBS_PDTIME_FMT = %Y%m%d-%H%M%S OBS_PDTIME_INPUT_TEMPLATE = {valid?fmt=%Y%m%d-%H%M%S} -OBS_PDTIME_OUTPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/ +OBS_PDTIME_OUTPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/ OBS_PDTIME_OUTPUT_TEMPLATE = time_list_lead{lead?fmt=%HHH}.txt @@ -59,7 +59,7 @@ OBS_PDTIME_OUTPUT_TEMPLATE = time_list_lead{lead?fmt=%HHH}.txt # Find the files for each time USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_FOR_EACH -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py {OBS_PDTIME_INPUT_TEMPLATE} {OBS_PDTIME_OUTPUT_DIR}/{OBS_PDTIME_OUTPUT_TEMPLATE} +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py {OBS_PDTIME_INPUT_TEMPLATE} {OBS_PDTIME_OUTPUT_DIR}/{OBS_PDTIME_OUTPUT_TEMPLATE} # Configurations for the Phase Diagram Plotting Script @@ -86,7 +86,7 @@ OBS_PHASE_DIAGRAM_INPUT_TIMELIST_TEXTFILE = {OBS_PDTIME_OUTPUT_DIR}/{OBS_PDTIME_ OBS_PHASE_DIAGRAM_INPUT_TIME_FMT = {OBS_PDTIME_FMT} # Plot Output Directory -PHASE_DIAGRAM_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/plots +PHASE_DIAGRAM_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/plots # Plot Ouptut Name OBS_PHASE_PLOT_OUTPUT_NAME = RMM_phase_diagram @@ -99,4 +99,4 @@ OBS_PHASE_PLOT_OUTPUT_NAME = RMM_phase_diagram USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/PhaseDiagram_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_PhaseDiagram/save_input_files_txt.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf similarity index 82% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf index 495a124b2f..8f6b64b8c4 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf +++ b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM.conf @@ -43,7 +43,7 @@ LEAD_SEQ = 0 LOOP_ORDER = processes # location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s_mjo # Run the obs for these cases OBS_RUN = True @@ -90,10 +90,10 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -derive mean {OBS_PCP_COMBINE_INPUT_DIR}/{OBS_PCP_COMBINE_INPUT_TEMPLATE} -field 'name="U_P850_mean"; level="(*,*)"; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S}";' -field 'name="U_P200_mean"; level="(*,*)"; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S}";' -name U_P850_mean,U_P200_mean -OBS_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean +OBS_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean OBS_PCP_COMBINE_INPUT_TEMPLATE = ERA_wind_daily_mean_*{valid?fmt=%m%d}.nc -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle OBS_PCP_COMBINE_OUTPUT_TEMPLATE = ERA_wind_daily_annual_{valid?fmt=%m%d}.nc @@ -128,10 +128,10 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -derive mean {OBS_PCP_COMBINE_INPUT_DIR}/{OBS_PCP_COMBINE_INPUT_TEMPLATE} -field 'name="olr"; level="(*,*)";' -OBS_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean +OBS_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean OBS_PCP_COMBINE_INPUT_TEMPLATE = ERA_OLR_daily_mean_*{valid?fmt=%m%d}.nc -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle OBS_PCP_COMBINE_OUTPUT_TEMPLATE = ERA_OLR_daily_annual_{valid?fmt=%m%d}.nc @@ -166,7 +166,7 @@ OBS_PCP_COMBINE_COMMAND = -derive mean {OBS_PCP_COMBINE_INPUT_DIR}/{OBS_PCP_COMB OBS_PCP_COMBINE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128uv.{valid?fmt=%Y%m%d}* -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean OBS_PCP_COMBINE_OUTPUT_TEMPLATE = ERA_wind_daily_mean_{valid?fmt=%Y%m%d}.nc @@ -201,7 +201,7 @@ OBS_PCP_COMBINE_COMMAND = -add {OBS_PCP_COMBINE_INPUT_DIR}/{OBS_PCP_COMBINE_INPU OBS_PCP_COMBINE_INPUT_DIR = /glade/u/home/kalb/MJO OBS_PCP_COMBINE_INPUT_TEMPLATE = olr.1x.7920.nc -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean OBS_PCP_COMBINE_OUTPUT_TEMPLATE = ERA_OLR_daily_mean_{valid?fmt=%Y%m%d}.nc @@ -218,7 +218,7 @@ VALID_INCREMENT = 86400 LEAD_SEQ = 0 # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle/ERA_OLR_daily_annual_{valid?fmt=%m%d}.nc,{INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle/ERA_wind_daily_annual_{valid?fmt=%m%d}.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle/ERA_OLR_daily_annual_{valid?fmt=%m%d}.nc,{INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/mean_daily_annual_cycle/ERA_wind_daily_annual_{valid?fmt=%m%d}.nc # Name of the file containing the listing of input files USER_SCRIPT_INPUT_TEMPLATE_LABELS = input_mean_daily_annual_infiles_olr,input_mean_daily_annual_infiles_wind @@ -235,7 +235,7 @@ USER_SCRIPT_COMMAND = echo Populated file list for Mean daily annual cycle Input USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean/ERA_OLR_daily_mean_{valid?fmt=%Y%m%d}.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean/ERA_OLR_daily_mean_{valid?fmt=%Y%m%d}.nc # Name of the file containing the listing of input files # The options are OBS_OLR_INPUT, OBS_U850_INPUT, OBS_U200_INPUT, FCST_OLR_INPUT, FCST_U850_INPUT, and FCST_U200_INPUT @@ -243,7 +243,7 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsE USER_SCRIPT_INPUT_TEMPLATE_LABELS = input_daily_mean_infiles # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py 'METPLUS_FILELIST_INPUT_MEAN_DAILY_ANNUAL_INFILES_OLR' 'olr' 'olr_NA_mean' '{OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly' 'ERA_OLR_anom' +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py 'METPLUS_FILELIST_INPUT_MEAN_DAILY_ANNUAL_INFILES_OLR' 'olr' 'olr_NA_mean' '{OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly' 'ERA_OLR_anom' # Configurations to create anomalies for U850 @@ -253,7 +253,7 @@ USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserS USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean/ERA_wind_daily_mean_{valid?fmt=%Y%m%d}.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean/ERA_wind_daily_mean_{valid?fmt=%Y%m%d}.nc # Name of the file containing the listing of input files # The options are OBS_OLR_INPUT, OBS_U850_INPUT, OBS_U200_INPUT, FCST_OLR_INPUT, FCST_U850_INPUT, and FCST_U200_INPUT @@ -261,7 +261,7 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsE USER_SCRIPT_INPUT_TEMPLATE_LABELS = input_daily_mean_infiles # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py 'METPLUS_FILELIST_INPUT_MEAN_DAILY_ANNUAL_INFILES_WIND' 'U_P850_mean' 'U_P850_mean' '{OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly' 'ERA_U850_anom' +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py 'METPLUS_FILELIST_INPUT_MEAN_DAILY_ANNUAL_INFILES_WIND' 'U_P850_mean' 'U_P850_mean' '{OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly' 'ERA_U850_anom' # Configurations to create anomalies for U200 @@ -271,7 +271,7 @@ USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserS USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean/ERA_wind_daily_mean_{valid?fmt=%Y%m%d}.nc +USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/daily_mean/ERA_wind_daily_mean_{valid?fmt=%Y%m%d}.nc # Name of the file containing the listing of input files # The options are OBS_OLR_INPUT, OBS_U850_INPUT, OBS_U200_INPUT, FCST_OLR_INPUT, FCST_U850_INPUT, and FCST_U200_INPUT @@ -279,7 +279,7 @@ USER_SCRIPT_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsE USER_SCRIPT_INPUT_TEMPLATE_LABELS = input_daily_mean_infiles # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py 'METPLUS_FILELIST_INPUT_MEAN_DAILY_ANNUAL_INFILES_WIND' 'U_P200_mean' 'U_P200_mean' '{OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly' 'ERA_U200_anom' +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py 'METPLUS_FILELIST_INPUT_MEAN_DAILY_ANNUAL_INFILES_WIND' 'U_P200_mean' 'U_P200_mean' '{OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly' 'ERA_U200_anom' # Configurations for regrid_data_plane: Regrid OLR to -15 to 15 latitude @@ -301,8 +301,8 @@ OBS_REGRID_DATA_PLANE_VAR1_LEVELS = "(*,*)" OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = OLR_anom # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Regrid # format of filenames # Input ERA Interim @@ -329,8 +329,8 @@ OBS_REGRID_DATA_PLANE_VAR1_LEVELS = "(*,*)" OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = U_P850_anom # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Regrid # format of filenames # Input ERA Interim @@ -357,8 +357,8 @@ OBS_REGRID_DATA_PLANE_VAR1_LEVELS = "(*,*)" OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = U_P200_anom # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Anomaly +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Regrid # format of filenames # Input ERA Interim @@ -384,9 +384,9 @@ OBS_U850_VAR_NAME = U_P850_anom OBS_U200_VAR_NAME = U_P200_anom # EOF Filename -OLR_EOF_INPUT_TEXTFILE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/EOF/rmm_olr_eofs.txt -U850_EOF_INPUT_TEXTFILE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/EOF/rmm_u850_eofs.txt -U200_EOF_INPUT_TEXTFILE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/EOF/rmm_u200_eofs.txt +OLR_EOF_INPUT_TEXTFILE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/EOF/rmm_olr_eofs.txt +U850_EOF_INPUT_TEXTFILE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/EOF/rmm_u850_eofs.txt +U200_EOF_INPUT_TEXTFILE = {INPUT_BASE}/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/EOF/rmm_u200_eofs.txt # Normalization factors for RMM RMM_OLR_NORM = 15.11623 @@ -397,7 +397,7 @@ PC2_NORM = 8.40736449709697 # Output Directory for the plots # If not set, it this will default to {OUTPUT_BASE}/plots -RMM_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/plots +RMM_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/plots # EOF plot information EOF_PLOT_OUTPUT_NAME = RMM_EOFs @@ -425,7 +425,7 @@ OBS_TIMESERIES_PLOT_OUTPUT_FORMAT = png USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE_PER_LEAD # Template of filenames to input to the user-script -USER_SCRIPT_INPUT_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Regrid/ERA_OLR_{valid?fmt=%Y%m%d}.nc,{OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Regrid/ERA_U850_{valid?fmt=%Y%m%d}.nc,{OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA/Regrid/ERA_U200_{valid?fmt=%Y%m%d}.nc +USER_SCRIPT_INPUT_TEMPLATE = {OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Regrid/ERA_OLR_{valid?fmt=%Y%m%d}.nc,{OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Regrid/ERA_U850_{valid?fmt=%Y%m%d}.nc,{OUTPUT_BASE}/s2s_mjo/UserScript_obsERA_obsOnly_RMM/ERA/Regrid/ERA_U200_{valid?fmt=%Y%m%d}.nc # Name of the file containing the listing of input files # The options are OBS_OLR_INPUT, OBS_U850_INPUT, OBS_U200_INPUT, FCST_OLR_INPUT, FCST_U850_INPUT, and FCST_U200_INPUT @@ -433,4 +433,4 @@ USER_SCRIPT_INPUT_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_RMM/ERA USER_SCRIPT_INPUT_TEMPLATE_LABELS = OBS_OLR_INPUT,OBS_U850_INPUT, OBS_U200_INPUT # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/RMM_driver.py +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/RMM_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/RMM_driver.py b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/RMM_driver.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/RMM_driver.py rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/RMM_driver.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py b/parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py rename to parm/use_cases/model_applications/s2s_mjo/UserScript_obsERA_obsOnly_RMM/compute_harmonic_anomalies.py diff --git a/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf b/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf similarity index 88% rename from parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf rename to parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf index 03adfa304b..0506c7d588 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf +++ b/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField.conf @@ -185,20 +185,20 @@ ENSEMBLE_STAT_OUTPUT_PREFIX = HRRRE_F{lead?fmt=%3H}_ADPSFC [dir] # Use case config directory -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField # input and output directories for pb2nc -PB2NC_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/hrrr_ensemble_sfc/prepbufr -PB2NC_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/rap +PB2NC_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/hrrr_ensemble_sfc/prepbufr +PB2NC_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/rap # input directory for ensemble_stat -FCST_ENSEMBLE_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/hrrr_ensemble_sfc/fcst +FCST_ENSEMBLE_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/hrrr_ensemble_sfc/fcst # point observation input dir for ensemble_stat (can also set grid obs) OBS_ENSEMBLE_STAT_POINT_INPUT_DIR = {PB2NC_OUTPUT_DIR} # output directory for ensemble_stat -ENSEMBLE_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/EnsembleStat +ENSEMBLE_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/EnsembleStat [filename_templates] @@ -221,9 +221,9 @@ FCST_ENSEMBLE_STAT_INPUT_TEMPLATE = OBS_ENSEMBLE_STAT_POINT_INPUT_TEMPLATE = {PB2NC_OUTPUT_TEMPLATE} ENSEMBLE_STAT_VERIFICATION_MASK_TEMPLATE = - {INPUT_BASE}/model_applications/convection_allowing_models/mask/EAST.nc, - {INPUT_BASE}/model_applications/convection_allowing_models/mask/WEST.nc, - {INPUT_BASE}/model_applications/convection_allowing_models/mask/CONUS.nc, - {INPUT_BASE}/model_applications/convection_allowing_models/mask/LMV.nc + {INPUT_BASE}/model_applications/short_range/mask/EAST.nc, + {INPUT_BASE}/model_applications/short_range/mask/WEST.nc, + {INPUT_BASE}/model_applications/short_range/mask/CONUS.nc, + {INPUT_BASE}/model_applications/short_range/mask/LMV.nc ENSEMBLE_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H%M} diff --git a/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/obs_error_table_V8.0.txt b/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/obs_error_table_V8.0.txt similarity index 100% rename from parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/obs_error_table_V8.0.txt rename to parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRRE_obsHRRRE_Sfc_MultiField/obs_error_table_V8.0.txt diff --git a/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf b/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf similarity index 95% rename from parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf rename to parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf index 22e00738e4..732e9b8997 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf +++ b/parm/use_cases/model_applications/short_range/EnsembleStat_fcstHRRR_fcstOnly_SurrogateSevere.conf @@ -17,10 +17,10 @@ FCST_PCP_COMBINE_RUN = True FCST_PCP_COMBINE_METHOD = DERIVE FCST_PCP_COMBINE_STAT_LIST = MAX -FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/surrogate_severe_calc +FCST_PCP_COMBINE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/surrogate_severe_calc FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/hrrr_ncep_{init?fmt=%Y%m%d%H}f{lead?fmt=%HHH}.grib2 -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/convection_allowing_models/surrogate_severe_calc +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/short_range/surrogate_severe_calc FCST_PCP_COMBINE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d}/hrrr_ncep_{init?fmt=%Y%m%d%H}f{lead?fmt=%HHH}.nc diff --git a/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf b/parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf similarity index 82% rename from parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf rename to parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf index aab5494da8..1413acf396 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf +++ b/parm/use_cases/model_applications/short_range/GridStat_fcstFV3_obsGOES_BrightnessTempDmap.conf @@ -48,11 +48,11 @@ GRID_STAT_NC_PAIRS_FLAG_DISTANCE_MAP = TRUE [dir] # Input and Output Diretory of the object data -FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature -OBS_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature +FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/brightness_temperature +OBS_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/brightness_temperature #Grid Stat output data location -GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/convection_allowing_models/brightness_temperature/grid_stat +GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/short_range/brightness_temperature/grid_stat [filename_templates] diff --git a/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf b/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf similarity index 92% rename from parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf rename to parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf index 27aff82488..c72fffc792 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +++ b/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf @@ -92,11 +92,11 @@ GRID_STAT_NC_PAIRS_FLAG_APPLY_MASK = FALSE [dir] # input and output data directories for each application in PROCESS_LIST -FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/surrogate_severe_prac_perfect +FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/surrogate_severe_prac_perfect OBS_GRID_STAT_INPUT_DIR = {FCST_GRID_STAT_INPUT_DIR} -GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/convection_allowing_models/surrogate_severe_prac_perfect/grid_stat +GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/short_range/surrogate_severe_prac_perfect/grid_stat [filename_templates] # format of filenames diff --git a/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf b/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf similarity index 92% rename from parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf rename to parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf index c066d23743..b4aba49ff1 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf +++ b/parm/use_cases/model_applications/short_range/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevereProb.conf @@ -97,11 +97,11 @@ GRID_STAT_NC_PAIRS_FLAG_APPLY_MASK = FALSE [dir] # input and output data directories for each application in PROCESS_LIST -FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/surrogate_severe_prac_perfect +FCST_GRID_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/surrogate_severe_prac_perfect OBS_GRID_STAT_INPUT_DIR = {FCST_GRID_STAT_INPUT_DIR} -GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/convection_allowing_models/surrogate_severe_prac_perfect/grid_stat/prob +GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/short_range/surrogate_severe_prac_perfect/grid_stat/prob [filename_templates] # format of filenames diff --git a/parm/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf b/parm/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf similarity index 73% rename from parm/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf rename to parm/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf index ba81602a7e..0874966bba 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf +++ b/parm/use_cases/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp.conf @@ -14,7 +14,7 @@ LOOP_ORDER = processes MET_DB_LOAD_RUNTIME_FREQ = RUN_ONCE -MET_DATA_DB_DIR = {METPLUS_BASE}/../METdatadb +MET_DATA_DB_DIR = {METPLUS_BASE}/../METdataio # XML file with settings for MET_DB_LOAD_XML_FILE = {PARM_BASE}/use_cases/met_tool_wrapper/METdbLoad/METdbLoadConfig.xml @@ -43,4 +43,4 @@ MET_DB_LOAD_MV_LOAD_MTD = false MET_DB_LOAD_MV_LOAD_MPR = false # Location of input files -MET_DB_LOAD_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp/grid_stat,{INPUT_BASE}/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp/grid_stat_obj,{INPUT_BASE}/model_applications/convection_allowing_models/METdbLoad_fcstFV3_obsGoes_BrightnessTemp/mode +MET_DB_LOAD_INPUT_TEMPLATE = {INPUT_BASE}/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp/grid_stat,{INPUT_BASE}/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp/grid_stat_obj,{INPUT_BASE}/model_applications/short_range/METdbLoad_fcstFV3_obsGoes_BrightnessTemp/mode diff --git a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf b/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf similarity index 83% rename from parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf rename to parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf index a9f02d47d8..7da3455855 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf +++ b/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp.conf @@ -70,7 +70,7 @@ OBS_VAR1_NAME = channel_13_brightness_temperature OBS_VAR1_LEVELS = "(*,*)" OBS_VAR1_OPTIONS = file_type = NETCDF_MET; -#CONFIG_DIR={PARM_BASE}/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp +#CONFIG_DIR={PARM_BASE}/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp MODE_CONFIG_FILE = {PARM_BASE}/met_config/MODEConfig_wrapped MODE_REGRID_TO_GRID = NONE @@ -78,13 +78,13 @@ MODE_OUTPUT_PREFIX = FV3_core_{instance} [dir] # Directory for FV3 data -FCST_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature +FCST_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/brightness_temperature # Directory of the GOES obs -OBS_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature +OBS_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/brightness_temperature # Output Data Location -MODE_OUTPUT_DIR = {OUTPUT_BASE}/convection_allowing_models/brightness_temperature +MODE_OUTPUT_DIR = {OUTPUT_BASE}/short_range/brightness_temperature [filename_templates] # Forecast Filename Template diff --git a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf b/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf similarity index 100% rename from parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf rename to parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTemp/ci_overrides.conf diff --git a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf b/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf similarity index 86% rename from parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf rename to parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf index 9eb9200b19..19f84437c2 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf +++ b/parm/use_cases/model_applications/short_range/MODE_fcstFV3_obsGOES_BrightnessTempObjs.conf @@ -33,7 +33,7 @@ MODE_MERGE_THRESH = <=235 MODE_MERGE_FLAG = NONE -MODE_MASK_POLY = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature/CentUS.nc +MODE_MASK_POLY = {INPUT_BASE}/model_applications/short_range/brightness_temperature/CentUS.nc # Forecast Brightness Temperature Variable Information MODEL = FV3_core @@ -108,20 +108,20 @@ GRID_STAT_OUTPUT_PREFIX = FV3_core_{instance} [dir] # Directory for FV3 data -FCST_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature +FCST_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/brightness_temperature # Directory of the GOES obs -OBS_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/brightness_temperature +OBS_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/brightness_temperature # MODE Output Data Location -MODE_OUTPUT_DIR = {OUTPUT_BASE}/convection_allowing_models/brightness_temperature/mode +MODE_OUTPUT_DIR = {OUTPUT_BASE}/short_range/brightness_temperature/mode # Input and Output Diretory of the object data FCST_GRID_STAT_INPUT_DIR = {MODE_OUTPUT_DIR} OBS_GRID_STAT_INPUT_DIR = {FCST_GRID_STAT_INPUT_DIR} #Grid Stat output data location -GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/convection_allowing_models/brightness_temperature/grid_stat_obj +GRID_STAT_OUTPUT_DIR = {OUTPUT_BASE}/short_range/brightness_temperature/grid_stat_obj [filename_templates] diff --git a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf b/parm/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf similarity index 87% rename from parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf rename to parm/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf index c236b9e6de..f7d9fabdf1 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf +++ b/parm/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2.conf @@ -66,7 +66,7 @@ OBS_VAR1_NAME = MESHMax60min OBS_VAR1_LEVELS = Z500 OBS_VAR1_OPTIONS = convert(x) = MM_to_IN(x); -#CONFIG_DIR={PARM_BASE}/use_cases/model_applications/convection_allowing_models/MODE_fcstHRRR_obsMRMS_Hail_GRIB2 +#CONFIG_DIR={PARM_BASE}/use_cases/model_applications/short_range/MODE_fcstHRRR_obsMRMS_Hail_GRIB2 #MODE_CONFIG_FILE = {CONFIG_DIR}/MODEConfig_hailcast MODE_CONFIG_FILE = {PARM_BASE}/met_config/MODEConfig_wrapped @@ -77,10 +77,10 @@ MODE_REGRID_WIDTH = 2 [dir] # Directory for HRRR data -FCST_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/hrrr_esrl +FCST_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/hrrr_esrl # Directory of the MRMS obs -OBS_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/hrrr_esrl +OBS_MODE_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/hrrr_esrl # Output Data MODE_OUTPUT_DIR = {OUTPUT_BASE}/hailtest diff --git a/parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf b/parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf similarity index 87% rename from parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf rename to parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf index b125e9ba99..affb8768f1 100644 --- a/parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf +++ b/parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect.conf @@ -142,24 +142,24 @@ REGRID_DATA_PLANE_GAUSSIAN_RADIUS = 120 [dir] # Input/Output directories can be left empty if the corresponding template contains the full path to the files -ASCII2NC_INPUT_DIR = {INPUT_BASE}/model_applications/convection_allowing_models/practically_perfect -POINT2GRID_INPUT_DIR = {OUTPUT_BASE}/model_applications/convection_allowing_models/practically_perfect -POINT2GRID_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/convection_allowing_models/practically_perfect +ASCII2NC_INPUT_DIR = {INPUT_BASE}/model_applications/short_range/practically_perfect +POINT2GRID_INPUT_DIR = {OUTPUT_BASE}/model_applications/short_range/practically_perfect +POINT2GRID_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/short_range/practically_perfect OBS_REGRID_DATA_PLANE_INPUT_DIR = {POINT2GRID_OUTPUT_DIR} OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {POINT2GRID_OUTPUT_DIR} -CONFIG_DIR = {PARM_BASE}/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect +CONFIG_DIR = {PARM_BASE}/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect # End of [dir] section and start of [filename_templates] section [filename_templates] # Template to look for input to ASCII2NC input storm reports ASCII2NC_INPUT_TEMPLATE = "{CONFIG_DIR}/read_ascii_storm.py {ASCII2NC_INPUT_DIR}/200205_rpts_filtered.csv" -ASCII2NC_OUTPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/convection_allowing_models/practically_perfect/StormReps.{init?fmt=%Y%m%d%H}.nc +ASCII2NC_OUTPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/short_range/practically_perfect/StormReps.{init?fmt=%Y%m%d%H}.nc # Templates to use for input to Point2Grid from the output of ASCII2NC and output from Point2Grid -POINT2GRID_INPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/convection_allowing_models/practically_perfect/StormReps.{init?fmt=%Y%m%d%H}.nc -POINT2GRID_OUTPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/convection_allowing_models/practically_perfect/StormReps_211.{init?fmt=%Y%m%d%H}.nc +POINT2GRID_INPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/short_range/practically_perfect/StormReps.{init?fmt=%Y%m%d%H}.nc +POINT2GRID_OUTPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/short_range/practically_perfect/StormReps_211.{init?fmt=%Y%m%d%H}.nc #Regrid data plane templates OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = StormReps_211.{init?fmt=%Y%m%d%H}.nc diff --git a/parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py b/parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py similarity index 100% rename from parm/use_cases/model_applications/convection_allowing_models/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py rename to parm/use_cases/model_applications/short_range/Point2Grid_obsLSR_ObsOnly_PracticallyPerfect/read_ascii_storm.py diff --git a/scripts/docker/docker_env/README.md b/scripts/docker/docker_env/README.md index 9b8adc0a63..e393513608 100644 --- a/scripts/docker/docker_env/README.md +++ b/scripts/docker/docker_env/README.md @@ -55,13 +55,13 @@ docker push dtcenter/metplus-envs:h5py ./scripts/h5py_env.sh py_embed_base ``` -## metdatadb (from metplus_base) +## metdataio (from metplus_base) ### Docker ``` -docker build -t dtcenter/metplus-envs:metdatadb --build-arg ENV_NAME=metdatadb . -docker push dtcenter/metplus-envs:metdatadb +docker build -t dtcenter/metplus-envs:metdataio --build-arg ENV_NAME=metdataio . +docker push dtcenter/metplus-envs:metdataio ``` ### Local diff --git a/scripts/docker/docker_env/scripts/metdatadb_env.sh b/scripts/docker/docker_env/scripts/metdataio_env.sh similarity index 87% rename from scripts/docker/docker_env/scripts/metdatadb_env.sh rename to scripts/docker/docker_env/scripts/metdataio_env.sh index 4a29a6981f..b0808167e2 100755 --- a/scripts/docker/docker_env/scripts/metdatadb_env.sh +++ b/scripts/docker/docker_env/scripts/metdataio_env.sh @@ -1,9 +1,9 @@ #! /bin/sh ################################################################################ -# Environment: metdatadb -# Last Updated: 2021-06-08 (mccabe@ucar.edu) -# Notes: Adds Python packages needed to run METdbLoad from METdatadb +# Environment: metdataio +# Last Updated: 2022-07-13 (mccabe@ucar.edu) +# Notes: Adds Python packages needed to run METdbLoad from METdataio # Python Packages: # lxml==3.8.0 # pymysql==1.0.2 @@ -13,7 +13,7 @@ ################################################################################ # Conda environment to create -ENV_NAME=metdatadb +ENV_NAME=metdataio # Conda environment to use as base for new environment BASE_ENV=$1

iA?GHM*5bV8^!CK{+nvXkf(aFh1!<2Uk1qz`@b``EgOhH;}PJUlZ~5yA-zfC&9n>s?plY^(HM32PWrLq7llKB!2Xmi zI%u`Wnd~h0Oyag4EcAA^8hl(w$By9bMBB|CD@f;w!&qs6EzeVAlyd1p+K#Oz`0nzH zjP`j#Ktm@MDP(E5rh1~4@?-NY7q3thB4k>-s)GcDL{O{9!PpOK2d z6VeLWtFh-~R<)}c`L}3HQHbw(J4ohSrCTYmf~Z}*jucVA8GcT7eBVa%ukLY9pC2nI zD@Yw{Yals7S~_Khq2RMeD44 zpVb(#)MG;IukDL{-Zd?*jb`s&-Ej_j@{kD|d_8IZD%g`4EIh;RReKtN*HEy0vW6C~ zfzDID!WZwf@#nT1xK5qBVbn^&zsaB!BY7QK{|{4d!4_q={tXX9mvnb`cbBxZgmkFH z&HRl z#MWBp9LwF0ylyVW3IHy{nC4kyUqma7kzH~BjQ>`(6Jt(S=D`U519@FgU*acfVGfuW z(^Kr1*}Jx9%orzk@JQY`kJ>h6VStg)yiA9U4M*=vsE0hT`*?Z(sc#lbQ|G z#mFCZ!xCl^!n=uVuv2Z5x4;;Eic)|fN|Fw;+(ZVbis%{O%J)1JafB4oRE1tPASM|2 z8=hy*({on`xeBzIKX1QciHTp&WA}0Q9dvP;g|lq?Zx2-jaa?!Z)`t+@)Cr0qaw6Qp z@AJud6)eB-CZB(1PjSvO_vMzXRGeqynY3!rq=x7Pc&EG%@&5$^SOE1|hI(aT*xM#; zhMZ78FFkym=iZyshfdqWinCY!PSrQWII@hj0DME6sG5*L#i*ZvsnJ2sAX1y|*L1 z<-K>0Z?h14d%Nw`|xLH~p6M=zc2B7x!hx??LTCA009yyx-$>)MUHt zq?eo&Xfe;0Ygs2^{keTUL7K{V;o-7Jb!A|E0p9VigF`sZpdxMFxBA~JD8Rp=8D^c| ze!B$F2$xufT(BoCq&~a!c;d8g5~R*9D61r*PE7b({)5KeYIH$XASS5jA!&iq*}0U^ zzq&}^*g$!hU#5xfhC>8TCm#B;KNnk=k+I`6&OKvYZ_`kZ4kS{+>aQK3XWtSx`_Ci` zOO3}Z(Li?=cr=I4s_}CvZi_qj{G6MYKMJeAZ3#wFbz!m=5_ITc47OfZKlLX#ZcQ3~ zU$2LyTavuH+m6$t8XU#u|;AeDjl-WQVzk?Kf@WAm$J z#XLtcD-KiwrzayuSU_gmedbm*I!5NzGT`Dlqsc*4C-N>`7|tqQF4EAi4AMjxwbV-8 zJs*P3jaC-AH<4mpb7f%*4-irhj~K5;i5hAH=DbNIa3#Bcz$V}pM{#d?T3^<`A5m?( zV%&JYcMq7g$I+?weUL21#{O`IgpWRTR2qXQd%Y-FDj-Ki4Jx~l}t*c|k{8timbMCrzc;ER4+-de{sdzEpJ z-DPQ2RIMp$E;qp^1AmlkgF#qElYJ)8&hK{1y|TGMnIX(}Kd+3-pNP&vq`QA9oj)UG zi=*TgW|HWv!R$mM@13{PcI|F^Cs-49I9guomaLnUXWT^<*X|>LfMbt9;ZsM$m2a(L#6C=7X%xKh_#lf)h?eAo!_^7 z0NAQ*HuFW4X9gR~?pUW?u%IF)3=Z2$Rl2q{&Y!>M>8pl|o(c2)Yn&ZFHiqPz7X{O1 z2x%J|IH-QQ0Oh$}_Bysi7V$mV+u4b+T2xOTdWAW!l@&vuN3kD6&4x!uKYX0GZm#MX zU)OJaEb(P-UuQ~sY}8Y{Vfeo*N(p6XdG0q|9PO9D7C|n+Zt!|P{p>Cs2mQ4-Q0Q%U z!>T$rJW|)m6mp>lO8e^S?(+f7gh#-mN9AfpIeJ04-^q>TY@Oc--Xov4VD@}8&A8$f z%>~BEojnIB`iqFStX<*2kAI5SEE?>5-rVHi@iV-Eyz4UMAX0UPy?(qfSOJo%jhyn27g<@n!{YOhB$%GmqD zL&hVNa*cGSi_+ai2V)<)a&mFvo2hXN0E_(cwIhGL3> zdsfb^X5hll&;-S=wSh2uJM-1Y8IcMTIgjAV#?VoIme(l(b8A@7%_DDN(5nFN$hV5x>1ypX8Eg#U}-BVxL1w4R#BI}rvGDZwp&~d#&lb0kD zESrYE;O2!kM*>Js!GSh=;Srufj}EY-8G`&BUw6ri{23Xp21tceM5*){v$d&P(WC7! zEaIM{6%%?}w{m2jX9vwLn_ubPv>mkc1XozTfei06;*0Fs*hVvw7;L|`4rIcC=TQrS z!sv*-_I7yl-Zk1`@nq=TE|qJFhi6Dszvi9eHe;E*J$c#MUIsEWthe+!RcoB+ppzoi z%9RxX34b|n?j~fMTxfaMUZVsj(m_Sv)4-2_aDSzt?^QpCN!(&<6)jL=$TH8qqX*L? zVXxGytpQ+!uOC}e$>AT5{B|P-8^xd5n(%sYwhFaFb1+i4rc)L(iwJa_FeyVS%0a39 zM;wgSy1*7&{y*J}jqHN2BRR2fj!`JQeph4CrV1RzNRD=iaOCl29U2gyz@%e$Yx-oj z*bwS()f_^1f!l;$PjS-LHv!d`%bjtXNEy7Dy#RWcb(4lae1z>EZ+t~gOMNel;|RoF zcut?uxX%=z`!+DCgFtOvQ|7cvE1Ek4H}qLk=#koG3@uvxdovNK;z*SgzQg& z2K6fP3d^=kxS)6bW$?vwW`#oI@*1U5S z(%&oEmt=9xM=*@7s-TNlaML3{>#JugZFf;Dh9xv-lf#%llebzgCG(x|74Nq6$B)xjI1LEFpu@L-jMzK=3qWq_A(g{3FO?fLM2^b!y zcUc~AZGEK48sr3Uk8jOcz5C5y9)Y&VleNCC(Kjb*FFR^m?nhUR*9@z9kb9%{0`3o= zip4MgA+wv?kINPg$i8L_*OxKHD(mmleO*sfoozAHx|un!Ic(ROXt(!Q?yr1*xkvYT zrh5%V`fsR!EP+_ce14HC>y#oxERG($TSIQMR*}hkRWwi_6-clxa&Vuf`=&Q%Hw*-lx`FVB8My$>J+tnji2u zBImY=5N6?svY|ow{P`{GsyVxlL91iXg;7v>yWkDz{+LX@HE-ExnGxP<_ z<#JlQf0|-zZils%eUAy_JHFWf@U+s$f=_v2by$W-;v`$e}uh z|A?o+Ha?2Oef8eTuOaIYNkm?63@Eg9`5R+k(%lHW%*GPo$HVSXY^)etgSs)dok#4- zY5(JPS7|-B^Xae=eBC@!F}7J>Y*NMSVz>2^7mOHmTny z!xF|o00{&Pc-szXy7fQrZ85uikaR>ktK`mhu#|Smr;mV?iUUKGPG0=N9e=wA>Zn9ONO9|~rD_OkKB8%HB zhU=*NDWDSKAq(B9y^Dp2a1|~qnZiC5cX(2Gh2h53 z=ARWvFOFOO*}Qb{;iM`z#TB`-xvCRm{z&9!?bwS~>;lry=JhkCXH8(!ieDjJ$E~yo z7mmPk2n zBSRqo)kF2w;od(`xg%HPw||qjbQD@h-f1WKdOb+D4r$izFG%z)r@EyhqHb&;Q)7cf zF`%Np0Mt<@yQ{r2LE!x2x#D=D&7?<6-gFZN zd=yGnT}8)TVQikH?C&p+uy^l?JMAU*XkS920k9j1wvNu^O^-PS$uJhss|&}#cud*q z$!WY`MP9lel59Q?$mvO5*jaD*?D%$9wA259%)Gr3@%)78#mAhc^DFj#c?i#YDC@~? z)?xiZVCeBldcz_yQjPVRQ4bd_4=_2zt9ml7WWHAI>CvS_^J@581!nFze7P+ZKwu>FSaG@;I_q#*F^qlH~ z1=ctt1!a1cyxFG;vmcf4B4+g4 z3`!&P{|(!#IE!D2eQ#0Ug#Yo@0-RYes0#CWifjLU8;q-pJ z-SSB@*@fS+2IT^qto5{I3b8-_&3B4ALV8b?10DDL%W+57#5YQ8md@FE#5k_XN`Xd_ z(n_#7=H_Ug-wgd6PZ89R@OB7q0jvA^G3$QPC&dxT>0>mg)I zASm!J<39os!8o9e<3lPIkbQ5&DtD7hR$l9fJz0<}S%uXA*`x`3emoP+RV)wbNT40$ zuz1lWW9ET=^w>XRhK^>_o-`O}K!>GcWm}nMNZX31C!kG2cwASLyr)M*2VwOe#@u`I zSbB-~H0ak^46ApI*=8_MX=@|q`r}2^|DcNd@v&xzV%J-&a~eCG(i1HR{&ZeERmsWl za`2r}JAPh*P4Gn-R(_TD%?C6!K4C6ww`jDm=jBjjt#Afpi`Z+A6E^aLjDM;iQJh z8`FxRoZ-QG#FS6d8;h93Qh1)xDUVC5T^XS!d(sKng(y1T^y;p1IGt7qSQo;g?m0#D z(MJ63%K!#t-j${?ozi!O+WdHvq0Y9AUK~V?;om;-G^PVbwWL^$-*0_ws{S4|QXP0a zk_Kpp!y0gx^Dh+?Bap#7teDe33*pB7$jQ1%xru00R(G*RNvOy84ok@v*#WVKzzrcZ ze@oCr`o26P?xYa$Stm{iboNU#_b4;aA!S(X496oP^3leQIT<-1D$ew?yU9X?a_uo& zXeC43RlUC<7p3XwV4bx+!ku;IMBO9JyTaUY$Gdgsno7gSN&>O8tW)=yC{TzSfdGk<$Or_%r&{gigk|EYKii>#6VL$1 zKtoZTWbnoRJTWk-(C*Rea`L>W=AAVAi6_t$Bubd5j!|{_u7@n<>>YgDKo;yMBUE5C zua<#LoeDGEC;Jm*8D&wcPj5cE9r$ZdLE*h@|;{q}8C zj2)iArHf9i4@YD_Y1Q4(F80fT=?0T!fZD?tGgM3_iAB|+3giUuTdEi3&(=ZR{eH4!ylqee#t7ut%h|6}C~Oe!H^o&uxckI8t%$X$3pw;86dEbzR0)7&RcL zO;Y{vcO5@Ox^~ee2dEgYOhvV>AjcgqTL9+PlNNdbj+P#q11fwEK||!1E;jrfl6uEPQe)Vil4|OT zT=?~R-Wlrhh_VT$9)frIR_X7Z_yU1mULAxIx`0nF64>1ocIaV#7U;^kAov-DCdlatChhD0_UV2)dw1(eYMwNbn+*T|>{U0*go&4bF?9t{8`JI5r_ zc^~eSufF|29GncJbqC)A|BD& zP~n+c=PGr{7aAO!eT|Q>l!$_C+uAcBMO84N<*@l_p+19ryoYb5x}gm*Y9upqI?nJY zTmwy*ou>r%OA!=!G=AQtaM5WOd#z?76&c)s9t39x*m!HA?N}*ry?<&m0iQ4CF|+v{ zWtS_>ef@1O@pbSt#2yAzxI1k%c89aZZ-2q^1@T8u-7_zbGGh+h$Jc41~ zpOZBvn*Qj(VNd@E7=f8bWVnT%Ry{?k7YBY0l^Da~=c~jxA3CfZ*ne)id%6^jQ5ZGh z@4L6yDTp@nVqngDtF-EY#i$ibtO;;&eg~ zBN~2t3bIy^BXx=|qAdf48Yadu6@yj^%OzNuF^y261PdysGkO6m|zwPO6-EMk0L>zxu9_si9xBqv0&yt1l=oD^w z6JIi3e)DJ##k_R722V)5dV?PhiVCKRg(ajiNwhV6FvOthwnt~LFJ~69<%r~9%7!wk z=YFL`6WnVY4n@e_^7bJQ{LgP2Q~NSBdPiyylk%*nlPD1U($t1b^m|HW8H^(W zXrjIE>xqLOiEH8dgrHeTz>^KTl#W0gdU)=m<8kSQ1#k8 zxx)(U4H;!>;BV2ZKg9 z{H6kTlxKZt@KgkISn0#f5=(0c-StZ|0_D(8z9aW)ZDR@gKV5j&`FU@tgn17+sgj3e zIp?7+F5dKqrv)0CvEi1I0E|fVT9VRG0n%z2)Kq%|QH7jiu1Nq33%wcwjhi1XDzXRk znWbs`S@AUZq&q&BB_MN}C^PTrJs#5UuK>)Q4bQJ|=9Wiwb8EZ*upt zb0R~ubx!F}aN!IHCnM(Ez*l+gh&hl z7b-&=$(VL~Uw#Bs+rd>CkGr>IN?0`bI{iQ(;rjd)PPXAt>~+U0a1?0BcIQIY+!$ac zjl3yN=)s$91T@^y=Y=G@Zw{cFD9#tOXa8ZTYaP-zCGrPlow-I+>JLF*9zFW|bWWWn zSTFP5<+iL9aFrjVdPgB9INihS{On3i3M0Rk{(1A+G%*`%KbpY%Iu07%mCB9nKc^mx zXT>-E@SbDWFiri#P@jfqVbQrWe;nik9Yw64AqsM=Ga8uhb*RAXE5x|k zhx(OQpx4oY?*j%w@2QbUFTW)F`U&g!F6w&!v`9LN%C!nH_k&SyzdVHxukS;)z?)J5 zhTT=m)7iScvPYeR#^1SK%1yf{zp!JZy`qYXyFJQ(` z`}eB+t*@=cZlC21uNR+CaXv3&^KBk{S>muZ8lL2Ou|ad*=n6RBNm3gS z*ONhTl!A-c-9x{F&ZyCRaV3J%udo6OBX-8He7Pr>R za(O%yEF<<*)&TJrPr0BgGG+(IpYP@*UM=pR^{?do1gg1{?7@g8cOKwNOFsnK8Dt6y z!QqEszUiIV>NPUjbp%Qkf;pS+xO;P^~qY5?6eVxH#n70)5r0B9%i|WT=7@ zqj%b*)jC4_)Qs{*5u|+w^P_c*j`Zd{!Z(mED6c+x+GjJ$>LI60w|8jAII$z6PnS+F zKfGe?3EOK>5QUNK%1F8vh7;?ROaIr5wPc|A5Jnu3-+U}4v0S%J;2XsjeggWJ=mkW1 z`5sd&4y5F-GRxKW@-;u^!;C)55R=v2DG&3zswzCJ@GUybS-Hz5;uUrtUJux z04&-vg8kCy5GCtmyKv5M@Q&m!6={|JNnJW=y!VV_yezIgwLvY_j7sOlhY{xV9-My+_q?aHdC-uB8E*&3kmkHRh zbG53$i_NwU-n9Twv0PUtmW65+UULR>7Yf!OC-o{bctU>G^cw9?WQTm_NB!OyLILN3U&vy`Pv8 zZhk#SiE(ComoFgTDM|P&xX_ih?%B#NVY;3J*R-Q}lZ4c6_MHzS;Ui2VCw+juOt1#I zJpXBi4>vElFJ-y->#E~Ukb7_E%jzqMxcByMbq$!g93VHgdK+~1T0;*wD`rU>3 zg`b6c0*aHNJ`-;L?#cgZ8{Ea=6MaoyDy1H=L=)kfX4gv=aCjrBUN@h`?%iDmk{>qp zS?tnmIQ~${Fn8Rpd2O!0pjUm}iOc>9biUCg^Oqy`WPdcGLA$^exQgVg*O-gI2XKepG|Ln?o3BM|i3`Ia1TSI=0&))-*kqtR4!Jq_76Zuy_qH#1_R` zI6FWn&UK>};rgi8`cLE;7CN4(OTNQ$1KaU(BZooV3Kh=`;_{=VQ-|RY?rFUJ*VQIv z#(2W2HaYQ)s3=kSfPX?d2h+%M{7l?LE3bplmI;U;`8ou*>wbQ4jXN5i;KHVcOH31Q z+|2)KSn~l7_@dt~&2S6MwWXQeof!*@!fMLb+u2B0`K5|;aq@Kn zp49h&qi8WPVXn?9bt6f^R|mltz)j>vDD&RAb4^POCu*F;#e48Ykwnb!cRbd1)k+-U zcuWtnw%~@|iKQ`}?_Cz3Ipts2a5qukvYsifY@1^WSf|U%j)5tDWdQ!FT*HNB7NFtr zk%50Kt&tr_%?B_q$%hKZaIPLf2gU(42w>MV>Fr{!)f z%F7HJY{ML)lKgWdl==PU!jVr^^YK}`9Lyfw)nL47;ooO5HI&P}`Z7R2Ab+oc2#%J0 zc0l^-7?S7qAZeB8GBQn7XN@=kUuBtqCP4*@F4~XGqsbKV_>091!YJ`0t`OT8Lbf;e zbXx7^M%C82h%EoMgBh)RZq2Gzhc{p!}&f%yL ze>a6Q69GGVIDotztWBjKJ=2UdHnWi(-(jA9v${=M>BMrr&x&xib@Y~pYiCE-G&UnK zAXBtleyx+rvdZNNC(v~VQCWcJsn=P+TmmA5ViwRTtLP04V^m9x#j(>xqSV_{ROKSI zU?UOt;AXMbURW=8`8CbmE#LoU0i-$DhDvcZd&hWGi1MQh;xV3i7ikd{Qx)WN;UM%W#axyZa24}Tsv*z(ugN}dxACg~)s}PEMd2gBR zK`&>*jaET!^fpR>fqaz_V!GRi-DF~3{q**5agFw0;x6g_5TY}!SVkOORLG{Sr?3q( zaG}vCmNY_JAEBAkLh?kr*PbpBMTF>T1!#{BNOFT^vaer^a?(4N=Hjy=n|#!M)=u%LV5|e`%t!*$MaD_}8O##ew^42g!oI&P=;1OpZ&G z=s?pUh4;CX_h}488Rrbm5rf3NVl)?vM7-Gu3$AV8I=3?nTS$mB-5i77>Gj{XwgpRd z{*Gwif?PmT`li~$`#9Jk4YWAXC-ub@N(=(godPv+^g(e?2Ii4c<)Yq!o|;L$Zf*~A z{$uu2q=4X4uU`gvV!?(VRyU$L)g3~NTHQll?YxuSR_euw7mJ=KyL-N@Eo1H1epoNZRRZI|@&*W`?*nF! zd~E*85{qKUGAo{zDTCoRvgTLbbJaEBM{Y+2e-a@=kPEdy>O|#uu1(B;!kBkqrUF9ivq%mSISL#0= z?H5Ha^{rTa@Jn+#@s@VRNVh7Hp zuf|n!)Y7M9riAK1kkj*7o_@!@6pWt1au4U3F(k+9z0PL0e^3QV&)RqjlwvZ6avQjj z5ypdM5(Z?3M|dHiMm#Tg;j8fulI(H_1Og+VbSs8>E)^?)q%rVY?y0-Pvt}#PnH`@w zDNpcKbOG>?`Ot*uD2wbGfy$xt*Qj=aYvgqq+{EV`>T2#?IlNykP>W`x;3&R*O}wllBo)mC{!Y5cg8Ht46*Y$tGY#$ z;O003y zHx`j%9#1PDO1wf|NnQPsDOPR4*y-oT>GxCe`?ZnXD_LU(_r%dNyHB5kt&E}UQe+7s)<`njmhjEC zJ*xoRhVusYkZfSzl#4XyaH745~jk!Ym zb5VpByvmoNmCq<(KkxXuWM@@Df)z;bmidg=p3KQ}hXF-y#)qErhbZ+fkDW}RH+463 z$=UZFn}%n8YymF9*WI2dkTc*!-x1vAr=>0^pXGNMTZTtSaA4f&VbyGR=5JI z_mE_EQ-1zO!=Y{AVpdTCW&BywZhK$1->b(vyBVkrf9ZvmI8z`hf~CYmyF`{_%Esld ziB1jJ3o(ahximhVo6TYe{UIIR;8e18D_?Hi;XVY?249?jt*_@(vq!io;sfDd0ejm+ z{)Vt|NQbBSU|Vd}+7`(^f2}gKALq(4JFh)05^>Xiap{G42R+?VzK#bg?hBxeg}KL{ zMT;uU^zM8J3JnTwi2kg+b5tO62)glb*X+7qu&xYSy0`@o#BB=&B~VP5^-cz{1heek z^E}P(SvvGxJGk6O395^=WV%ezBv{UPEK~x2vU?LRc>vI)W66!JL(}jtHw`dW5jnt| zXj=h`@H^!6eM85#>>r17tJN>5rDp=VQNHi zq6FdXy<`XQC6lMHo_u6K>X@&U{o|6zV;L*|*%}qDI6xyJ`}1(uJ4#)Mjc8MY@DAx@ zl5(~3=kboi1Oljd)T1*z+#v0p`-xRIq;!_i~QHT{ZoR{n$CW7_z&R`ZU>o1BmfF)jNO z{`JNo25*a_=oa}Qb&9-wLxEFA_8)WBP(oaXi^b~=vKuC&GeKLC1D$?@KGRXWRI5G9 zeD@Zew~6jK^9BV@Z_u_N<+2C1ta>ET&d=daxF=b$i1MM zM&w~HE1KpDi3xu+H8~sWO!u{f7-s_47zpC2y9dx!Dl^B?aaP41kAGhTT$o*SJpOpY z57P1_w-`FwhAf~f57$+GWEDi&l;vso@ASXzrxZ>ma9CZ$?`dyw9L%_3WBQfw|9<|D zuS5Yi9NR|u!~N7-3*VP?zObmid&HZtAGZ=nmU^aDWCqCaq5_xTmmwG7`k3l(8>^0y zSEa4SNM;j+#MGdJIWw_KW`be+%c`8`W6RCvv&7Co*9nocXa2T_ha)pn7rxP4Jq~lG zcAVXL@`iOHV$?HigbPZYmqCs2*!*+nvT7t>88H-S0gSi>=75GXP=GY+SB#`F_bl+x%i(QUesL$0(#SMzTLJ(tj=r88U z3|BgPm#HLBa1sC(xMoY%({<23$NtnrL z06G9@CyiMuNI|-+xLExgP}mvx>2787L{g#VvXbF09W^Ed7Vw$x*M&M9Yw6%xcTxd< zcO~rDu46+V>P{3#U)nOzqod{eYo>BgxdXxoSQ}_x2h+SvVp+r8N8(dG?PXsZ;et4p z1lo@r4e_$-_^Apzp}7~ED|-TE@Xtlua)*hTz6m?8%!=4NfDRX#+ zQ{|>WT5suB=9o_chYKyclH0M@V&$hcG|*$))(om~xSgyvaflOx6=h$}EJ>L~jV6&f zsIQV`IZCs?x3Qj7+B_vUs+>i9Y>s+-|trsO`3*|emC4_B1?Aa=e!?!!6aXcn{nmJ?4qn`j+h$SlOyc! z1)ifcPV2eswx$A>6h-kidHm1~;WY5qkYpW5vGSFP2BjQXa}gZ`=U$}bANR{Si5#ZZ2G32=`uIW5xvLVbXOpJJ*;|VBNaV2v#QsH z2_M$bh~OtZE7rHFHsy`eQS))J{=`7xVzf&S{v~SEeQufS!%M37W;X%otJInGvU(S( z*G*LaumlmUxufNNB^z6nXOzD!fLrJVeYe1G&Z{8iuNuB)IOi?P4_{L5h(56^?-m;% zV&3Fk)7@l1)$YdQh_*EBr>Ly26qVFYzA#w70%)I(pc4M=(iwbU+G3wz$wlHJHH8tz z9c`5j?=eKvLb8Kz0Nl3#BHERXN!nf8g886eUCN%ZC%G5+sG+qOSu1ag&-y6x_@`FZ>vI!F4L??v9iJYI}uyhp9E(@ zvTiSo3e%((_SUvdQxpxnGKd;lp_RyUuv7S_W>`l5;k2-yoV>9N>z~mG7$zyLzHl+b zZj=}shU7)4XRg2sijeCAG(GmrtOpA&wALo6lZ(j>Rs7FM*TS`aFZUMQs)UH$USA@& z{;J^&+G?HKSiDhRx}o&%lYvR*kf#6FRZu#~RCYN!QWm<2@iV&T?;&XSpjr z)IHD#E=Eg%!2#t(KT(*2EcRyrR5-Lzef!#8y)VM#3tINf1bp$cV0|@@sI!Q}GVHi^ zGjvP5FaMp`DnuQLl;6gW8CBP5H`Q;tlhBU`n9pHu0EmL~Gr0#nILnZo(UPL<_H zRCBmVCC$P2zEuCcp{aiL{MM7zRsrhYeoupbqy8w8N01|p3XJp#(`tpeN8NGQ9}HXDaHw5WKga!Dh^0lypSoMsa$gB-n2?Dj64kDk9~ZN4lL zqx3iBgosmqBHyi+)QkN|?NL64+Plk%q@YbKFQu#XA{mFkK@wa$?WN|i<3kW^Gxvw0 zwuUI3al8c()f+O!*?-NmEn{XwdMh|y#)Yr_y*)vwrK3l6H?3LkW1C!*@0RH9qNiE; z!}wUo8Vv3R`GxmEzxLV-=Pg0}6%@vKj5O-jWCBGB*iA3iJes1_d`8rT+~emBo#28@ z^{wP!uU!Tpna`@W5y*^UWd=jc`9;s~3O3iDcSOwWAs-D%1U@a?eblQW7lQ={qMtB_ z9AaHQC!Cc59EdU(fAcj?h}F9TvTE54Mc~`EJst8SVGM~0={n~dp0PG;Hm&EVZVg-x zqL6&i0lDvpQ!&MEK}Gul1lZCw9mPEwN?g zZUVX|-5QImv3)|Ad`vDGbY?^VJ{na|T7*utBq$2j|FJMu>qJD@@!Q8V41HUo8 zf;v3e1h3wgI7T;){ezAt@2*Je_nsl;BsjUH3I3XI@JFmoociAb9 zK_IdcJN+EHrV>9~Ol-JX=m^d-Htw`F#Nn;W=8X|J>Xh3UVq^hXHrGD9=*xa)J3cO!Li_Xa3@e?t=?9u#8oa=S%?znza5DcfiE+Ruerk|JGt ze1%MWA7*j}e)a?!Fu7F>dY?XzD*eY!X^#i*Dat^gv=d28BQbmT^xF)YAgA}dQ;4Y( zJ77O#fH>eDHqCnf4Jl>ex4+yExYh^ZSZx3x{pVU31(<2~a6_#0_H`{hVt-JfP6GBRqfb z`CL8jBIV5Bcbq0eg2A+iPIa!Qrv;#KqJ2_TFiLGlwHZEo^ zL+2q zX#Sxg+^G&wpYlL~aY9$=phL`D`Sm+7;P)DTx$E zPRG-iBWCws{8DH{X|mc6e5SuwxfYg)Tp>W z;M!3C=84LKLyVtWWfxNC)xpX%w`tBs-r0<7L;eJ@J;>oAP^IuI+P-L?VRxjlpMA`5 z)z_UC`L5Qt&(%RwTBg~V933vo@M*i~XuL?_=3gY|Urw18rLTS>wZo)sQ*hHkCCs9a z^S*UzW!9qO&5Mh5o;X2rFvb~5p7d%`(WZDQwT0TNwEmBxh870S=vmYMy>!TGFm)Dux$Xj5# z-cB!Zy&URxMn1n@#QBj9ZeNHfI(WZf-pB`Ib2#$3BT}9--&}a0nF3-ekt0~EF7Hv` zhu)Ek5^h^X;u8CQ2x;Krtyo5Ot)cGz?fl5J(QA6qeX$9?=qI4DvG0*+Z)P3Gp~o!3-v|SN(iI?pX=0a&wufQQ&Jd0tIBGC!vxqcu8_zphW{@ks)-HPkt=Eu z^id$*Rd30`OE6lDAO8?!DdThP5)1QdUo0fi3p1WYzPRn3&gg!4$LytH{pW;1Ci$C`z?{d-3`U7d_iri;nP7 zULhpS3@z>Ao!;hetX=*{Cbj(t#~r7(9pM*fG(B{Qn2>sB3oMj;VO44?bLt?k*y_WN z`{@HJLic1|e=7F8n}z#*uQ2t-MJi9)505Y<#_K#2cS%POQXGp|llpMBR+^n_qrl1< z2I8~?VO(KNbI!%!(RI0&^#|48-Bb1I*@kf&sVHl1=(1eK24gXv#Z?P`)KVe8VK565 z@U$J{mRMg}GeA@hkeD~a{J?niu$kVZmQ)i2?!iHM4PA zsfM+Sqs9;ItF&WFX}}dzR2P=G8tFG9tN$Yy;h!lnkhk828WvAOOSgW_wztM=Y?u?W z#B}MxMtc0{n?NgVHsb1ZQd!h@{P`^sY6E1*`$HPYe6p&S zxyS)x4gu+@h_jE0c2h|*k3?(pr;i_OK9|}5ahH#=uRpx?(ae(lAJ#lxsGNHy_&69rYOIt zZ{sB4NT6J7NtZ#_YO*i-7ga;LFtd$YZVWB2gDiLQOLOS~%(CjP=nN;W(}bNrV+xjF z=J~bGpG*;-3-67{j3NFhHU<_>%(#WB1eDj5u2*w;teeC9n8B+h!>N|#w@y`^HC7;l zr(-yOt1>HeQP9gjTKjCj=c8tpVB|Kv1IT9nse!QEQ%E61&BFk3vs>BYX1%xN8eKWC z1L0A!ZC}i3^p1P7%dLCj6GeLR(={|y&dP&^ypyIMuI~Oe>o6B_zmFt@fy>_1eTpv^ zL2=YYN0H$H{Tuf@cJ87ib%Os`w_Pd}eIo3XT~t+49jxfr-d#AdK^^7(_mYR(%PP9B z{I)(<23jiuILU*`5i#3)YAdy|U6jk;-g4-AMR}*5zY}2JO~nqrp?WLD`X4|lTy*+hPB@)geSil;ilFguoKEj71nZ!+^XS|H=%%Va?CLz% zL4mNlM6VgVgL?v5lQRj*X;DR)x39o8}SeZ42B3fUKPF@FCE zBNpuD66!hdh18!|(^jCEN6ZG?+B*kA%c6t_+kWoI;;(j#H(mFei#=EfK6N$w2meOs z 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