Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,21 @@ repos:

# Python file formatting
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.4
rev: v0.15.9
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format

# Snakemake file formatting
- repo: https://github.com/snakemake/snakefmt
rev: v0.11.4
rev: v1.0.0
hooks:
- id: snakefmt

# Spelling
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
rev: v2.4.2
hooks:
- id: codespell
files: .*\.(py|smk|md)$|^Snakefile$
Expand Down
12 changes: 6 additions & 6 deletions tests/integration/Snakefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@ configfile: workflow.source_path("./test_config.yaml")
# `config`: specifies the module configuration.
# `pathvars:` helps you re-wire where the module places files.
module module_hydropower:
snakefile:
"../../workflow/Snakefile"
config:
config["module_hydropower"]
pathvars:
# Redirect specific user resources (inputs)
shapes="resources/inputs/{shapes}/shapes.parquet",
Expand All @@ -21,6 +17,10 @@ module module_hydropower:
logs="resources/hydropower/logs",
resources="resources/hydropower/resources",
results="resources/hydropower/results",
snakefile:
"../../workflow/Snakefile"
config:
config["module_hydropower"]


# rename all module rules with a prefix, to avoid naming conflicts.
Expand All @@ -33,12 +33,12 @@ SHAPES = ["MNE"]

# Request something from the module
rule all:
message:
"Generate PU timeseries for a small country."
default_target: True
input:
expand(
"results/outputs/{shapes}/{plant_type}_pu.parquet",
shapes=SHAPES,
plant_type=PLANTS,
),
message:
"Generate PU timeseries for a small country."
4 changes: 2 additions & 2 deletions workflow/Snakefile
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,14 @@ validate_year_config()


rule all:
message:
"ERROR: Invalid `rule all:` call"
default_target: True
output:
"INVALID",
log:
stderr="<logs>/all.stderr",
conda:
"envs/shell.yaml"
message:
"ERROR: Invalid `rule all:` call"
shell:
'echo "This workflow must be called as a snakemake module." > {log.stderr}'
42 changes: 21 additions & 21 deletions workflow/rules/automatic.smk
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,42 @@


rule download_eia:
message:
"Download the EIA International energy statistics in bulk."
params:
url=internal["resources"]["automatic"]["EIA"],
output:
zipfile="<resources>/automatic/eia/EIA-INTL.zip",
log:
"<logs>/download_eia.log",
localrule: True
conda:
"../envs/shell.yaml"
params:
url=internal["resources"]["automatic"]["EIA"],
message:
"Download the EIA International energy statistics in bulk."
shell:
r'curl -fsSLo {output.zipfile:q} "{params.url}"'


rule download_basin:
message:
"Downloading HydroBASINS file for '{wildcards.continent}'."
params:
url=lambda wc: internal["resources"]["automatic"]["HydroBASINS"].format(
continent=wc.continent
),
output:
path="<resources>/automatic/hydrobasins/{continent}.zip",
log:
"<logs>/download_basin_{continent}.log",
wildcard_constraints:
continent="|".join(internal["continent_codes"]),
localrule: True
conda:
"../envs/shell.yaml"
log:
"<logs>/download_basin_{continent}.log",
localrule: True
params:
url=lambda wc: internal["resources"]["automatic"]["HydroBASINS"].format(
continent=wc.continent
),
message:
"Downloading HydroBASINS file for '{wildcards.continent}'."
shell:
r'curl -fsSLo {output.path:q} "{params.url}"'


rule download_cutout:
message:
"Downloading runoff cutout from {params.start_year}-01-01 to {params.end_year}-12-31."
params:
era5_crs=internal["era5_crs"],
start_year=config["years"]["start"],
end_year=config["years"]["end"],
input:
shapes="<shapes>",
output:
Expand All @@ -53,10 +47,16 @@ rule download_cutout:
caption="../report/cutout.rst",
category="Hydropower module",
),
conda:
"../envs/hydropower.yaml"
log:
"<logs>/{shapes}/download_cutout.log",
localrule: True
conda:
"../envs/hydropower.yaml"
params:
era5_crs=internal["era5_crs"],
start_year=config["years"]["start"],
end_year=config["years"]["end"],
message:
"Downloading runoff cutout from {params.start_year}-01-01 to {params.end_year}-12-31."
script:
"../scripts/download_cutout.py"
22 changes: 11 additions & 11 deletions workflow/rules/basins.smk
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,29 @@


rule basins_extract_pfafstetter_level:
message:
"Unzipping HydroBASINS file for '{wildcards.continent}' at Pfafstetter level '{params.level}'."
params:
level=lambda wc: wc.level,
continent=lambda wc: wc.continent,
input:
zip_file=rules.download_basin.output.path,
output:
parquet_file=temp(
"<resources>/automatic/hydrobasins/{continent}_{level}.parquet"
),
log:
"<logs>/basins_extract_pfafstetter_level_{continent}_{level}.log",
wildcard_constraints:
continent="|".join(internal["continent_codes"]),
level="|".join(internal["pfafstetter_level_codes"]),
conda:
"../envs/hydropower.yaml"
log:
"<logs>/basins_extract_pfafstetter_level_{continent}_{level}.log",
params:
level=lambda wc: wc.level,
continent=lambda wc: wc.continent,
message:
"Unzipping HydroBASINS file for '{wildcards.continent}' at Pfafstetter level '{params.level}'."
script:
"../scripts/basins_extract_pfafstetter_level.py"


rule basins_combine_continents:
message:
"Combine all HydroBASINS into a single dataset for Pfafstetter level '{wildcards.level}'."
input:
continent_files=expand(
"<resources>/automatic/hydrobasins/{continent}_{{level}}.parquet",
Expand All @@ -39,9 +37,11 @@ rule basins_combine_continents:
caption="../report/basins.rst",
category="Hydropower module",
),
conda:
"../envs/hydropower.yaml"
log:
"<logs>/basins_combine_continents_{level}.log",
conda:
"../envs/hydropower.yaml"
message:
"Combine all HydroBASINS into a single dataset for Pfafstetter level '{wildcards.level}'."
script:
"../scripts/basins_combine_continents.py"
40 changes: 20 additions & 20 deletions workflow/rules/powerplants.smk
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@


rule powerplants_adjust_location:
message:
"Adjusting hydro powerplant location to the nearest shape and basin."
params:
crs=config["crs"],
basin_adjustment=config["powerplants"]["basin_adjustment"],
input:
basins=f"<resources>/automatic/hydrobasins/global_{config["pfafstetter_level"]}.parquet",
powerplants="<powerplants>",
Expand All @@ -22,15 +17,16 @@ rule powerplants_adjust_location:
"<logs>/{shapes}/powerplants_adjust_location.log",
conda:
"../envs/hydropower.yaml"
params:
crs=config["crs"],
basin_adjustment=config["powerplants"]["basin_adjustment"],
message:
"Adjusting hydro powerplant location to the nearest shape and basin."
script:
"../scripts/powerplants_adjust_location.py"


rule powerplants_get_inflow_m3:
message:
"Calculating hydro powerplant inflow in m3."
params:
smoothing_hours=config["smoothing_hours"],
input:
adjusted_powerplants=rules.powerplants_adjust_location.output.adjusted_powerplants,
basins=f"<resources>/automatic/hydrobasins/global_{config["pfafstetter_level"]}.parquet",
Expand All @@ -42,16 +38,15 @@ rule powerplants_get_inflow_m3:
"<logs>/{shapes}/powerplants_get_inflow_m3.log",
conda:
"../envs/hydropower.yaml"
params:
smoothing_hours=config["smoothing_hours"],
message:
"Calculating hydro powerplant inflow in m3."
script:
"../scripts/powerplants_get_inflow_m3.py"


rule powerplants_get_inflow_mwh:
message:
"Calculating powerplant generation in MWh and applying corrections using historical data."
params:
pu_factor_range=internal["pu_factor_range"],
technology_mapping=config["powerplants"]["technology_mapping"],
input:
inflow_m3=rules.powerplants_get_inflow_m3.output.inflow,
adjusted_powerplants=rules.powerplants_adjust_location.output.adjusted_powerplants,
Expand All @@ -62,15 +57,16 @@ rule powerplants_get_inflow_mwh:
"<logs>/{shapes}/powerplants_get_inflow_mwh.log",
conda:
"../envs/hydropower.yaml"
params:
pu_factor_range=internal["pu_factor_range"],
technology_mapping=config["powerplants"]["technology_mapping"],
message:
"Calculating powerplant generation in MWh and applying corrections using historical data."
script:
"../scripts/powerplants_get_inflow_mwh.py"


rule powerplants_get_pu_per_shape:
message:
"Calculating aggregated per-unit timeseries per shape for '{wildcards.plant_type}'."
params:
technology_mapping=config["powerplants"]["technology_mapping"],
input:
adjusted_powerplants=rules.powerplants_adjust_location.output.adjusted_powerplants,
inflow_mwh="<disaggregated_inflow>",
Expand All @@ -81,11 +77,15 @@ rule powerplants_get_pu_per_shape:
caption="../report/pu_per_shape.rst",
category="Hydropower module",
),
wildcard_constraints:
plant_type="|".join(["run_of_river", "reservoir"]),
log:
"<logs>/{shapes}/powerplants_get_pu_per_shape_{plant_type}.log",
wildcard_constraints:
plant_type="|".join(["run_of_river", "reservoir"]),
conda:
"../envs/hydropower.yaml"
params:
technology_mapping=config["powerplants"]["technology_mapping"],
message:
"Calculating aggregated per-unit timeseries per shape for '{wildcards.plant_type}'."
script:
"../scripts/powerplants_get_pu_per_shape.py"
8 changes: 4 additions & 4 deletions workflow/rules/statistics.smk
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@


rule prepare_statistics:
message:
"Get EIA annual country hydropower generation statistics."
params:
years=config["years"],
input:
shapes="<shapes>",
eia_bulk=rules.download_eia.output.zipfile,
Expand All @@ -16,5 +12,9 @@ rule prepare_statistics:
"<logs>/{shapes}/prepare_statistics.log",
conda:
"../envs/hydropower.yaml"
params:
years=config["years"],
message:
"Get EIA annual country hydropower generation statistics."
script:
"../scripts/prepare_statistics.py"
Loading