diff --git a/README.md b/README.md index 9b0c977e..b8be4199 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,64 @@ Another feature is to manipulate the field values by scaling with an arbitrary f ## Installation -You can install pyflexplot from MCH pypi repository using pip: +__Prerequisites__: Git, [Miniforge](https://conda-forge.org/download) +(or another Conda installation), +[Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer) + +### Get source code + +```bash +git clone git@github.com:MeteoSwiss-APN/pyflexplot.git +cd pyflexplot +``` + +### Create Conda environment + +Create a Conda environment with only the desired Python version and Poetry and activate it + +```bash +conda create -n pyflexplot python=3.10 poetry=1.8 +conda activate pyflexplot +``` + +Configure Poetry to not create a new virtual environment. If it detects an already enabled +virtual environment (eg a Conda environment) it will install dependencies into it: + +```bash +poetry config --local virtualenvs.create false +``` + +### Build the project (Poetry) +Alternative build with mchbuild see further below. + +```bash +poetry install +``` + +### Build the project (mchbuild) + +_Documentation to be added._ + +### Run tests and quality tools + +```bash +poetry run pytest +``` + +If no errors occur, the tests save plots in their respective folders in the + +#### Run quality assurance tools + +Run pylint to check code style of Python files (if any): + +```bash +poetry run pylint src +``` + +Run mypy to check typing: ```bash -pip install pyflexplot -i https://service.meteoswiss.ch/nexus/repository/python-all/simple +poetry run mypy ``` ## Run pyflexplot @@ -243,58 +297,6 @@ pyflexplot --preset "$preset" --merge-pdfs --dest=s3:// ## Development -__Prerequisites__: Git, [Miniconda](https://docs.anaconda.com/free/miniconda/) or -[Miniforge](https://github.com/conda-forge/miniforge) -(for installation of Conda), or -[Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer) - -### Install dependencies & start the service locally (CSCS) - -Clone the repo and enter the project folder: - -```bash -git clone git@github.com:MeteoSwiss-APN/pyflexplot.git && cd pyflexplot -``` - -Create a Conda environment with only the desired Python version and Poetry and activate it: - -```bash -conda create --yes --name pyflexplot python=3.10 poetry=1.8 -conda activate pyflexplot -``` - -Configure Poetry to not create a new virtual environment. If it detects an already enabled virtual (eg Conda) environment it will install dependencies into it: - -```bash -poetry config --local virtualenvs.create false -``` - -Install packages: - -```bash -poetry install -``` - -### Run the tests and quality tools - -Run tests: - -```bash -poetry run pytest -``` - -Run pylint to check code style of Python files (if any): - -```bash -poetry run pylint src -``` - -Run mypy to check typing: - -```bash -poetry run mypy -``` - ### Updating the Test References Pyflexplot includes a set of functionality tests that compare generated output against predefined reference data. diff --git a/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_png.toml b/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_png.toml index 21e064f8..d4c44a80 100644 --- a/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_png.toml +++ b/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_png.toml @@ -7,7 +7,7 @@ model = "ICON-CH1-CTRL" lang = "de" outfile_time_format = "%Y%m%dT%H%M" combine_species = false -outfile = "forecast-iconch1eps-dispersion~{base_time}~{plot_variable}~{domain}~{release_site}~{species_id}~{time_step}.png" +outfile = "forecast-iconch1eps-dispersion~{base_time}~{plot_variable}~{domain}~{release_site}~{species_name}~{time_step}.png" [_base._concentration] plot_variable = "concentration" diff --git a/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_shp.toml b/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_shp.toml index 507da62f..70fe5825 100644 --- a/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_shp.toml +++ b/src/pyflexplot/data/presets/opr/icon-ch1-ctrl/all_shp.toml @@ -28,13 +28,13 @@ time = -1 combine_species = true [_base._concentration."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Konzentration_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Konzentration_{species_name}_{time_step}.shp" [_base._concentration._integr."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_integrierte_Luftaktivitaet_{species_id}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_integrierte_Luftaktivitaet_{species_name}.shp" [_base._tot_deposition."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Deposition_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Deposition_{species_name}_{time_step}.shp" [_base._affected_area."_shp+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_beaufschl_Gebiet.shp" diff --git a/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_pdf.toml b/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_pdf.toml index 757baf85..1949da6e 100644 --- a/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_pdf.toml +++ b/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_pdf.toml @@ -7,7 +7,7 @@ ens_member_id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1 model = "ICON-CH2-EPS" lang = "de" outfile_time_format = "%Y%m%dT%H%M" -combine_species = true +combine_species = false [_base._concentration] plot_variable = "concentration" @@ -29,21 +29,25 @@ plot_variable = "affected_area" integrate = true level = 0 time = -1 +combine_species = true [_base._concentration."_probability+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_probability_{domain}.pdf" ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._concentration._integr."_probability+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_probability_{domain}.pdf" ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._tot_deposition."_probability+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_probability_{domain}.pdf" ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._affected_area."_probability+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_probability_{domain}.pdf" @@ -55,6 +59,7 @@ outfile = "{release_start}_{release_site}_FLEXPART-{model}_probability_{domain}. plot_type = "multipanel" multipanel_param = "time" time = [2, 4, 8, -1] +combine_species = true [_base._concentration._integr."_pctl95+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_percentile_{domain}.pdf" @@ -93,9 +98,11 @@ time = 0 [_base._concentration._cloud."_arrival+"] ens_variable = "cloud_arrival_time" +combine_species = true [_base._concentration._cloud."_departure+"] ens_variable = "cloud_departure_time" +combine_species = true [_base._concentration._integr."_min+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_cloud_statistics_{domain}.pdf" @@ -136,14 +143,17 @@ ens_variable = "mean" [_base._concentration._integr."_median+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_cloud_statistics_{domain}.pdf" ens_variable = "median" + [_base._tot_deposition."_median+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_cloud_statistics_{domain}.pdf" ens_variable = "median" + [_base._affected_area."_median+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_cloud_statistics_{domain}.pdf" ens_variable = "median" ["**".full] domain = "full" + ["**".ch] domain = "ch" diff --git a/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_png.toml b/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_png.toml index 986d4284..511c5195 100644 --- a/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_png.toml +++ b/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_png.toml @@ -7,8 +7,8 @@ ens_member_id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1 model = "ICON-CH2-EPS" lang = "de" outfile_time_format = "%Y%m%dT%H%M" -combine_species = true -outfile = "forecast-iconch2eps-dispersion~{base_time}~{plot_variable}-{ens_variable}~{domain}~{release_site}~1~{time_step}.png" +combine_species = false +outfile = "forecast-iconch2eps-dispersion~{base_time}~{plot_variable}-{ens_variable}~{domain}~{release_site}~{species_name}~{time_step}.png" [_base._concentration] plot_variable = "concentration" @@ -30,18 +30,22 @@ plot_variable = "affected_area" integrate = true level = 0 time = -1 +combine_species = true [_base._concentration."_probability+"] ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._concentration._integr."_probability+"] ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._tot_deposition."_probability+"] ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._affected_area."_probability+"] ens_variable = "probability" @@ -66,9 +70,11 @@ time = 0 [_base._concentration._cloud."_arrival+"] ens_variable = "cloud_arrival_time" +combine_species = true [_base._concentration._cloud."_departure+"] ens_variable = "cloud_departure_time" +combine_species = true [_base._concentration._integr."_min+"] ens_variable = "minimum" diff --git a/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_shp.toml b/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_shp.toml index e930f3af..59bd61ff 100644 --- a/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_shp.toml +++ b/src/pyflexplot/data/presets/opr/icon-ch2-eps/all_shp.toml @@ -7,7 +7,7 @@ ens_member_id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1 model = "ICON-CH2-EPS" lang = "de" outfile_time_format = "%Y%m%dT%H%M" -combine_species = true +combine_species = false [_base._concentration] plot_variable = "concentration" @@ -29,39 +29,43 @@ plot_variable = "affected_area" integrate = true level = 0 time = -1 +combine_species = true [_base._concentration."_probability+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit-Konzentration_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit_Konzentration_{species_name}_{time_step}.shp" ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._concentration._integr."_probability+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit-integrierte-Luftaktivitaet_{species_id}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit_integrierte-Luftaktivitaet_{species_name}.shp" ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._tot_deposition."_probability+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit-Deposition_{species_id}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit_Deposition_{species_name}.shp" ens_variable = "probability" ens_param_thr = 0 +combine_species = true [_base._affected_area."_probability+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit-beaufschl_Gebiet.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wahrscheinlichkeit_beaufschl_Gebiet.shp" ens_variable = "probability" ens_param_thr = 0 [_base._concentration._integr."_pctl95+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_95-Perzentil.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_95-Perzentil_integrierte-Luftaktivitaet_{species_name}.shp" ens_variable = "percentile" ens_param_pctl = 95 [_base._tot_deposition."_pctl95+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_95-Perzentil.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_95-Perzentil_Deposition_{species_name}.shp" ens_variable = "percentile" ens_param_pctl = 95 [_base._affected_area."_pctl95+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_95-Perzentil.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_95-Perzentil_beaufschl_Gebiet.shp" ens_variable = "percentile" ens_param_pctl = 95 @@ -73,17 +77,19 @@ time = 0 [_base._concentration._cloud."_arrival+"] ens_variable = "cloud_arrival_time" outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wolkenankunftszeit.shp" +combine_species = true [_base._concentration._cloud."_departure+"] ens_variable = "cloud_departure_time" outfile = "{release_start}_{release_site}_FLEXPART-{model}_Wolkenabzugszeit.shp" +combine_species = true [_base._concentration._integr."_min+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Minimum_integrierte-Luftaktivitaet.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Minimum_integrierte-Luftaktivitaet_{species_name}.shp" ens_variable = "minimum" [_base._tot_deposition."_min+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Minimum_Deposition.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Minimum_Deposition_{species_name}.shp" ens_variable = "minimum" [_base._affected_area."_min+"] @@ -91,11 +97,11 @@ outfile = "{release_start}_{release_site}_FLEXPART-{model}_Minimum_beaufschl_Geb ens_variable = "minimum" [_base._concentration._integr."_max+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Maximum_integrierte-Luftaktivitaet.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Maximum_integrierte-Luftaktivitaet_{species_name}.shp" ens_variable = "maximum" [_base._tot_deposition."_max+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Maximum_Deposition.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Maximum_Deposition_{species_name}.shp" ens_variable = "maximum" [_base._affected_area."_max+"] @@ -103,11 +109,11 @@ outfile = "{release_start}_{release_site}_FLEXPART-{model}_Maximum_beaufschl_Geb ens_variable = "maximum" [_base._concentration._integr."_mean+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Mittel_integrierte-Luftaktivitaet.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Mittel_integrierte-Luftaktivitaet_{species_name}.shp" ens_variable = "mean" [_base._tot_deposition."_mean+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Mittel_Deposition.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Mittel_Deposition_{species_name}.shp" ens_variable = "mean" # [_base._affected_area."_mean+"] # for affected area, mean is same area as max -> skip mean @@ -115,11 +121,11 @@ ens_variable = "mean" # ens_variable = "mean" [_base._concentration._integr."_median+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Median_integrierte-Luftaktivitaet.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Median_integrierte-Luftaktivitaet_{species_name}.shp" ens_variable = "median" [_base._tot_deposition."_median+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Median_Deposition.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Median_Deposition_{species_name}.shp" ens_variable = "median" [_base._affected_area."_median+"] diff --git a/src/pyflexplot/data/presets/opr/ifs-hres-eu/all_shp.toml b/src/pyflexplot/data/presets/opr/ifs-hres-eu/all_shp.toml index d6b75d61..c1d4a0cf 100644 --- a/src/pyflexplot/data/presets/opr/ifs-hres-eu/all_shp.toml +++ b/src/pyflexplot/data/presets/opr/ifs-hres-eu/all_shp.toml @@ -28,13 +28,13 @@ time = -1 combine_species = true [_base._concentration."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Konzentration_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Konzentration_{species_name}_{time_step}.shp" [_base._concentration._integr."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_integrierte_Luftaktivitaet_{species_id}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_integrierte_Luftaktivitaet_{species_name}.shp" [_base._tot_deposition."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Deposition_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Deposition_{species_name}_{time_step}.shp" [_base._affected_area."_shp+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_beaufschl_Gebiet.shp" diff --git a/src/pyflexplot/data/presets/opr/ifs-hres/all_shp.toml b/src/pyflexplot/data/presets/opr/ifs-hres/all_shp.toml index fb89b8d8..3ac80efd 100644 --- a/src/pyflexplot/data/presets/opr/ifs-hres/all_shp.toml +++ b/src/pyflexplot/data/presets/opr/ifs-hres/all_shp.toml @@ -28,13 +28,13 @@ time = -1 combine_species = true [_base._concentration."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Konzentration_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Konzentration_{species_name}_{time_step}.shp" [_base._concentration._integr."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_integrierte_Luftaktivitaet_{species_id}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_integrierte_Luftaktivitaet_{species_name}.shp" [_base._tot_deposition."_shp+"] -outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Deposition_{species_id}_{time_step}.shp" +outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_Deposition_{species_name}_{time_step}.shp" [_base._affected_area."_shp+"] outfile = "{release_start}_{release_site}_FLEXPART-{model}_Dispersion_beaufschl_Gebiet.shp"