From 5961680b4d75cc2991cbe46d9ff494d7f4fa7b26 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 13:52:09 +0200 Subject: [PATCH 01/19] fix: use combine_indicators instead of collect_indicators --- rules/cba.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/cba.smk b/rules/cba.smk index ba3c33b441..bf4c85ca90 100644 --- a/rules/cba.smk +++ b/rules/cba.smk @@ -589,7 +589,7 @@ def summary_benchmark_indicators(w): run=[run], ) return expand( - rules.collect_indicators.output.indicators, + rules.combine_indicators.output.indicators, planning_horizons=[w.planning_horizons], run=[run], ) From 63951f5cf1ad7341dc5e0996206a5d5f0cbc6f1a Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 14:57:22 +0200 Subject: [PATCH 02/19] feat: make retrieve_gas_infrastructure_data optional --- rules/build_sector.smk | 25 +++++++++++++++++++++++-- scripts/prepare_sector_network.py | 4 ++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index d6458675a8..90ba220438 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1644,6 +1644,28 @@ def input_pemmdb_data(w): } +def input_gas_network(w): + inputs = {} + if config_provider("sector", "gas_network")(w) or config_provider( + "sector", "H2_retrofit" + )(w): + inputs["clustered_gas_network"] = resources("gas_network_base_s_{clusters}.csv") + if config_provider("sector", "gas_network")(w) or ( + config_provider("sector", "imports", "enable")(w) + and ( + "gas" in config_provider("sector", "imports", "carriers")(w) + or ( + "H2" in config_provider("sector", "imports", "carriers")(w) + and not config_provider("sector", "h2_topology_tyndp")(w) + ) + ) + ): + inputs["gas_input_nodes_simplified"] = resources( + "gas_input_locations_s_{clusters}_simplified.csv" + ) + return inputs + + def include_tyndp_projects(w): horizons = config_provider("tyndp_investment_candidates", "elec_projects")(w) if not horizons: @@ -1667,8 +1689,7 @@ rule prepare_sector_network: unpack(input_heat_source_power), unpack(input_offshore_hubs), unpack(input_pemmdb_data), - **rules.cluster_gas_network.output, - **rules.build_gas_input_locations.output, + unpack(input_gas_network), retro_cost=lambda w: ( resources("retro_cost_base_s_{clusters}.csv") if config_provider("sector", "heating")(w) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 376126510e..219dab68d2 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -9804,8 +9804,8 @@ def add_hydro_tyndp( ) pop_weighted_energy_totals.update(pop_weighted_heat_totals) - fn = snakemake.input.gas_input_nodes_simplified - gas_input_nodes = pd.read_csv(fn, index_col=0) + fn = snakemake.input.get("gas_input_nodes_simplified") + gas_input_nodes = pd.read_csv(fn, index_col=0) if fn else None if options.get("keep_existing_capacities", False): existing_capacities, existing_efficiencies = get_capacities_from_elec( From 033c4d2e68d0693bd1f8a2e08fcebd9d2acbbe5e Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 15:16:00 +0200 Subject: [PATCH 03/19] feat: make retrieve_h2_salt_caverns optional --- rules/build_sector.smk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 90ba220438..1706c20210 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1740,7 +1740,11 @@ rule prepare_sector_network: if config_provider("foresight")(w) == "overnight" else resources("costs_{planning_horizons}_processed.csv") ), - h2_cavern=resources("salt_cavern_potentials_s_{clusters}.csv"), + h2_cavern=branch( + config_provider("sector", "h2_topology_tyndp"), + None, + resources("salt_cavern_potentials_s_{clusters}.csv"), + ), busmap_s=resources("busmap_base_s.csv"), busmap=resources("busmap_base_s_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_base_s_{clusters}.csv"), From b2cb6679443de8fd42d03ab7081a2e68043f613e Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 15:32:54 +0200 Subject: [PATCH 04/19] feat: make retrieve_powerplants optional --- rules/build_electricity.smk | 11 ++++++++++- rules/solve_myopic.smk | 11 ++++++++++- scripts/add_electricity.py | 17 ++++++++++------- scripts/add_existing_baseyear.py | 6 +++++- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 93d1ea3a56..5fd6f8f287 100755 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -816,7 +816,16 @@ rule add_electricity: f"costs_{config_provider('costs', 'year')(w)}_processed.csv" ), regions=resources("regions_onshore_base_s_{clusters}.geojson"), - powerplants=resources("powerplants_s_{clusters}.csv"), + powerplants=lambda w: ( + resources("powerplants_s_{clusters}.csv") + if ( + config_provider("electricity", "conventional_carriers")(w) + or config_provider("electricity", "extendable_carriers", "Generator")( + w + ) + ) + else [] + ), hydro_capacities=ancient("data/hydro_capacities.csv"), unit_commitment="data/unit_commitment.csv", fuel_price=lambda w: ( diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 33acc625cf..9a478c7ff3 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -10,7 +10,16 @@ rule add_existing_baseyear: network=resources( "networks/base_s_{clusters}_{opts}_{sector_opts}_{planning_horizons}.nc" ), - powerplants=resources("powerplants_s_{clusters}.csv"), + powerplants=lambda w: ( + resources("powerplants_s_{clusters}.csv") + if ( + config_provider("electricity", "conventional_carriers")(w) + or config_provider("electricity", "extendable_carriers", "Generator")( + w + ) + ) + else [] + ), costs=lambda w: resources( f"costs_{config_provider('scenario', 'planning_horizons',0)(w)}_processed.csv" ), diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index efe64b62e0..119b8f681c 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -1342,13 +1342,16 @@ def attach_stores( costs = load_costs(snakemake.input.costs) - ppl = load_and_aggregate_powerplants( - snakemake.input.powerplants, - costs, - params.consider_efficiency_classes, - params.aggregation_strategies, - params.exclude_carriers, - ) + if ppl_fn := snakemake.input.powerplants: + ppl = load_and_aggregate_powerplants( + ppl_fn, + costs, + params.consider_efficiency_classes, + params.aggregation_strategies, + params.exclude_carriers, + ) + else: + ppl = pd.DataFrame() if snakemake.params.load_source != "tyndp": logger.info( diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 3fd00fc28c..e0ae5333df 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -208,7 +208,11 @@ def add_power_capacities_installed_before_baseyear( """ logger.debug(f"Adding power capacities installed before {baseyear}") - df_agg = pd.read_csv(powerplants_file, index_col=0) + df_agg = ( + pd.read_csv(powerplants_file, index_col=0) + if powerplants_file + else pd.DataFrame() + ) rename_fuel = { "Hard Coal": "coal", From a6f4093792dbd10d5edf5eb4259abaa1d564575a Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 16:10:24 +0200 Subject: [PATCH 05/19] feat: deprecate dependencies listed in tyndp_versions.csv --- data/tyndp_versions.csv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/tyndp_versions.csv b/data/tyndp_versions.csv index ff0e3d58cf..a57b2c60a2 100644 --- a/data/tyndp_versions.csv +++ b/data/tyndp_versions.csv @@ -10,7 +10,7 @@ co2stop,26-august-2020,tyndp-archive,latest supported,2026-05-08,,https://storag copernicus_land_cover,v3.0.1,tyndp-archive,latest supported,2026-05-08,"The primary is already from Zenodo, documentation in https://zenodo.org/records/4723921",https://storage.googleapis.com/open-tyndp-data-store/archive/eur/copernicus_land_cover/v3.0.1 corine,v18_5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/corine/v18_5/corine.zip costs,v0.14.0,tyndp-archive,latest supported,2026-05-08,Part of the `technologydata` repository and versioned on GitHub.,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/costs/v0.14.0 -country_hdd,2025-08-13,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/country_hdd/2025-08-13/era5-HDD-per-country.csv +country_hdd,2025-08-13,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/country_hdd/2025-08-13/era5-HDD-per-country.csv country_runoff,2025-08-13,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/country_runoff/2025-08-13/era5-runoff-per-country.csv desnz_electricity_consumption,2026-02-16,tyndp-archive,latest supported,2026-02-16,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/desnz_electricity_consumption/2026-02-16/Subnational_electricity_consumption_statistics_2005-2024.xlsx dh_areas,341.5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/dh_areas/341.5/dh_areas.gpkg @@ -24,12 +24,12 @@ eurostat_balances,2026-02,tyndp-archive,latest supported,2026-05-08,,https://sto eurostat_household_balances,2025-07-09,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/eurostat_household_balances/2025-07-09/nrg_d_hhq.csv gdp_per_capita,2018-02-06,tyndp-archive,latest supported,2026-05-08,"Primary link is a direct download, earlier part of zenodo bundle",https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gdp_per_capita/2018-02-06/GDP_per_capita_PPP_1990_2015_v2.nc gebco,2014,tyndp-archive,latest supported,2026-05-08,Earlier part of databundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gebco/2014/GEBCO_2014_2D.nc -gem_europe_gas_tracker,may-2024,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_europe_gas_tracker/may-2024/Europe-Gas-Tracker-2024-05.xlsx +gem_europe_gas_tracker,may-2024,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_europe_gas_tracker/may-2024/Europe-Gas-Tracker-2024-05.xlsx gem_gcct,july-2025,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_gcct/july-2025/Global-Cement-and-Concrete-Tracker_July-2025.xlsx gem_gspt,march-2025-v1.1,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_gspt/march-2025-v1.1/Plant-level-data-Global-Iron-and-Steel-Tracker-March-2025-V1.1.xlsx geothermal_heat_utilisation_potentials,341.5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/geothermal_heat_utilisation_potentials/341.5/Results_DH_Matching_Cluster.xlsx ghg_emissions,v23,tyndp-archive,latest supported,2026-05-08,earlier part of databundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ghg_emissions/v23/UNFCCC_v23.csv -h2_salt_caverns,16-10-2019,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/h2_salt_caverns/16-10-2019/h2_salt_caverns_GWh_per_sqkm.geojson +h2_salt_caverns,16-10-2019,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/h2_salt_caverns/16-10-2019/h2_salt_caverns_GWh_per_sqkm.geojson hotmaps_industrial_sites,version-1.1,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/hotmaps_industrial_sites/version-1.1/Industrial_Database.csv jrc_ardeco,2021,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/jrc_ardeco/2021 jrc_energy_atlas,2026-02-16,tyndp-archive,latest supported,2026-02-16,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/jrc_energy_atlas/2026-02-16/electricity_tot_demand_2019.tif @@ -42,7 +42,7 @@ neso_electricity_demand,2026-02-02,tyndp-archive,latest supported,2026-05-08,,ht nitrogen_statistics,2023,tyndp-archive,latest supported,2026-02-26,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/nitrogen_statistics/2023/nitro-ert.xlsx nitrogen_statistics,2022,tyndp-archive,supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/nitrogen_statistics/2022/nitro-ert.xlsx nuts3_population,13-03-2025,tyndp-archive,latest supported,2026-05-08,earlier part of zenodo bundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/nuts3_population/13-03-2025/nama_10r_3popgdp.tsv.gz -ons_lad,may-2024,tyndp-archive,latest supported,2026-02-17,API request used,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ons_lad/may-2024/Local_Authority_Districts_May_2024_Boundaries__UK_BSC.geojson +ons_lad,may-2024,tyndp-archive,deprecated not-supported,2026-02-17,API request used,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ons_lad/may-2024/Local_Authority_Districts_May_2024_Boundaries__UK_BSC.geojson open_tyndp_prelim,0.7.1,primary,not-supported,2026-06-02,Open-TYNDP preliminary outcomes,https://zenodo.org/records/20303009 open_tyndp_prelim,0.7.1,archive,latest supported,2026-06-02,Open-TYNDP preliminary outcomes (results-0.7.1.zip),https://zenodo.org/records/20303009/files/results-0.7.1.zip open_tyndp_prelim,0.7.1,tyndp-archive,latest supported,2026-06-02,Open-TYNDP preliminary outcomes (results-0.7.1.zip),https://storage.googleapis.com/open-tyndp-data-store/outcomes/0.7.1/results-0.7.1.zip @@ -59,8 +59,8 @@ opsd_electricity_demand,2026-02-02,tyndp-archive,latest supported,2026-05-08,,ht osm,0.7,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/osm/0.7 osm_boundaries,unknown,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/osm_boundaries/unknown/osm_boundaries.zip population_count,2018-11-01,tyndp-archive,latest supported,2026-05-08,earlier part of zenodo bundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/population_count/2018-11-01/ppp_2019_1km_Aggregated.tif -powerplants,0.8.1,tyndp-archive,latest supported,2026-05-08,Part of the `powerplantmatching` package and versioned on GitHub.,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/powerplants/0.8.1/powerplants.csv -scigrid_gas,1.1.2,tyndp-archive,latest supported,2026-05-08,the primary is already from Zenodo published by original authors,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/scigrid_gas/1.1.2/IGGIELGN.zip +powerplants,0.8.1,tyndp-archive,deprecated not-supported,2026-05-08,Part of the `powerplantmatching` package and versioned on GitHub.,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/powerplants/0.8.1/powerplants.csv +scigrid_gas,1.1.2,tyndp-archive,deprecated not-supported,2026-05-08,the primary is already from Zenodo published by original authors,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/scigrid_gas/1.1.2/IGGIELGN.zip seawater_temperature,v1.0,tyndp-archive,latest supported,2026-05-08,Test cutout seawater temperature,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/seawater_temperature/v1.0/seawater_temperature.nc ship_raster,v5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ship_raster/v5/shipdensity_global.zip synthetic_electricity_demand,v2,tyndp-archive,latest supported,2026-05-08,the primary is already from Zenodo published by original authors,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/synthetic_electricity_demand/v2/demand_hourly.csv From af4704eb85e4f189f6949ed1b09a1d2cfc543e65 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 16:26:49 +0200 Subject: [PATCH 06/19] feat: make retrieve_hdd optional --- rules/build_sector.smk | 5 ++++- scripts/prepare_sector_network.py | 9 +++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 1706c20210..e13ee53952 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1720,7 +1720,10 @@ rule prepare_sector_network: pop_weighted_energy_totals=resources( "pop_weighted_energy_totals_s_{clusters}.csv" ), - pop_weighted_heat_totals=resources("pop_weighted_heat_totals_s_{clusters}.csv"), + pop_weighted_heat_totals=branch( + config_provider("sector", "heating"), + resources("pop_weighted_heat_totals_s_{clusters}.csv"), + ), shipping_demand=resources("shipping_demand_s_{clusters}.csv"), transport_demand=resources("transport_demand_s_{clusters}.csv"), transport_data=resources("transport_data_s_{clusters}.csv"), diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 219dab68d2..1655926a54 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -9799,10 +9799,11 @@ def add_hydro_tyndp( pop_weighted_energy_totals = ( pd.read_csv(snakemake.input.pop_weighted_energy_totals, index_col=0) * nyears ) - pop_weighted_heat_totals = ( - pd.read_csv(snakemake.input.pop_weighted_heat_totals, index_col=0) * nyears - ) - pop_weighted_energy_totals.update(pop_weighted_heat_totals) + if options["heating"]: + pop_weighted_heat_totals = ( + pd.read_csv(snakemake.input.pop_weighted_heat_totals, index_col=0) * nyears + ) + pop_weighted_energy_totals.update(pop_weighted_heat_totals) fn = snakemake.input.get("gas_input_nodes_simplified") gas_input_nodes = pd.read_csv(fn, index_col=0) if fn else None From 0a8cbbfefff56a2d874f2efee4319ffc338dbd52 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 16:48:17 +0200 Subject: [PATCH 07/19] fix: add missing reference for clustered_gas_network --- rules/build_sector.smk | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index e13ee53952..3b6a3e7e04 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1646,10 +1646,16 @@ def input_pemmdb_data(w): def input_gas_network(w): inputs = {} - if config_provider("sector", "gas_network")(w) or config_provider( - "sector", "H2_retrofit" - )(w): - inputs["clustered_gas_network"] = resources("gas_network_base_s_{clusters}.csv") + + def include_gas_network(w): + return config_provider("sector", "gas_network")(w) or config_provider( + "sector", "H2_retrofit" + )(w) + + inputs["clustered_gas_network"] = ( + resources("gas_network_base_s_{clusters}.csv") if include_gas_network else None + ) + if config_provider("sector", "gas_network")(w) or ( config_provider("sector", "imports", "enable")(w) and ( From 8b7d5c1748087506dacf290a38a23564f1710387 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Mon, 20 Jul 2026 17:11:00 +0200 Subject: [PATCH 08/19] feat: make retrieve_ghg_emissions optional --- data/tyndp_versions.csv | 2 +- rules/build_sector.smk | 12 +++++++++--- rules/postprocess.smk | 4 +++- scripts/build_energy_totals.py | 17 ++++++++++------- scripts/prepare_sector_network.py | 17 +++++++++-------- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/data/tyndp_versions.csv b/data/tyndp_versions.csv index a57b2c60a2..db03e6b427 100644 --- a/data/tyndp_versions.csv +++ b/data/tyndp_versions.csv @@ -28,7 +28,7 @@ gem_europe_gas_tracker,may-2024,tyndp-archive,deprecated not-supported,2026-05-0 gem_gcct,july-2025,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_gcct/july-2025/Global-Cement-and-Concrete-Tracker_July-2025.xlsx gem_gspt,march-2025-v1.1,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_gspt/march-2025-v1.1/Plant-level-data-Global-Iron-and-Steel-Tracker-March-2025-V1.1.xlsx geothermal_heat_utilisation_potentials,341.5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/geothermal_heat_utilisation_potentials/341.5/Results_DH_Matching_Cluster.xlsx -ghg_emissions,v23,tyndp-archive,latest supported,2026-05-08,earlier part of databundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ghg_emissions/v23/UNFCCC_v23.csv +ghg_emissions,v23,tyndp-archive,deprecated not-supported,2026-05-08,earlier part of databundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ghg_emissions/v23/UNFCCC_v23.csv h2_salt_caverns,16-10-2019,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/h2_salt_caverns/16-10-2019/h2_salt_caverns_GWh_per_sqkm.geojson hotmaps_industrial_sites,version-1.1,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/hotmaps_industrial_sites/version-1.1/Industrial_Database.csv jrc_ardeco,2021,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/jrc_ardeco/2021 diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 3b6a3e7e04..423cf137ef 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -830,7 +830,9 @@ rule build_swiss_energy_balances: rule build_energy_totals: input: nuts3_shapes=resources("nuts3_shapes.geojson"), - co2=rules.retrieve_ghg_emissions.output["csv"], + co2=branch( + rules.retrieve_ghg_emissions.output["csv"], config_provider("co2_budget") + ), swiss=resources("switzerland_energy_balances.csv"), swiss_transport=f"{BFS_ROAD_VEHICLE_STOCK_DATASET['folder']}/vehicle_stock.csv", idees=rules.retrieve_jrc_idees.output["directory"], @@ -1739,8 +1741,12 @@ rule prepare_sector_network: config_provider("sector", "residential_heat", "dsm", "enable"), resources("residential_heat_dsm_profile_total_base_s_{clusters}.csv"), ), - co2_totals_name=resources("co2_totals.csv"), - co2=rules.retrieve_ghg_emissions.output["csv"], + co2_totals_name=branch( + resources("co2_totals.csv"), config_provider("co2_budget") + ), + co2=branch( + rules.retrieve_ghg_emissions.output["csv"], config_provider("co2_budget") + ), biomass_potentials=resources( "biomass_potentials_s_{clusters}_{planning_horizons}.csv" ), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 7f873fe9fd..08ef6726ad 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -468,7 +468,9 @@ rule plot_summary: energy=RESULTS + "csvs/energy.csv", balances=RESULTS + "csvs/energy_balance.csv", eurostat=resources("eurostat_energy_balances.csv"), - co2=rules.retrieve_ghg_emissions.output["csv"], + co2=branch( + rules.retrieve_ghg_emissions.output["csv"], config_provider("co2_budget") + ), output: costs=RESULTS + "graphs/costs.pdf", energy=RESULTS + "graphs/energy.pdf", diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 2ec6154519..6c028e9d7d 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -1366,13 +1366,16 @@ def build_heating_efficiencies( ) district_heat_share.to_csv(snakemake.output.district_heat_share) - base_year_emissions = params["base_emissions_year"] - emissions_scope = snakemake.params.energy["emissions"] - eea_co2 = build_eea_co2(snakemake.input.co2, base_year_emissions, emissions_scope) - eurostat_co2 = build_eurostat_co2(eurostat, base_year_emissions) - - co2 = build_co2_totals(countries, eea_co2, eurostat_co2) - co2.to_csv(snakemake.output.co2_name) + if co2_fn := snakemake.input.co2: + base_year_emissions = params["base_emissions_year"] + emissions_scope = snakemake.params.energy["emissions"] + eea_co2 = build_eea_co2(co2_fn, base_year_emissions, emissions_scope) + eurostat_co2 = build_eurostat_co2(eurostat, base_year_emissions) + + co2 = build_co2_totals(countries, eea_co2, eurostat_co2) + co2.to_csv(snakemake.output.co2_name) + else: + pd.DataFrame().to_csv(snakemake.output.co2_name) transport = build_transport_data(countries, population, idees) transport.to_csv(snakemake.output.transport_name) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1655926a54..48af26f6a0 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -10230,14 +10230,15 @@ def add_hydro_tyndp( limit = co2_cap.loc[investment_year] else: limit = get(co2_budget, investment_year) - add_co2limit( - n, - options, - snakemake.input.co2_totals_name, - snakemake.params.countries, - nyears, - limit, - ) + if limit: + add_co2limit( + n, + options, + snakemake.input.co2_totals_name, + snakemake.params.countries, + nyears, + limit, + ) maxext = snakemake.params["lines"]["max_extension"] if maxext is not None: From 0063076cba7519f2dfc59942c50324d2bc8e2d0a Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Tue, 21 Jul 2026 09:14:07 +0200 Subject: [PATCH 09/19] chore: align config files --- config/test/config.tyndp.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/test/config.tyndp.yaml b/config/test/config.tyndp.yaml index f62e2f2da9..5107dd6203 100644 --- a/config/test/config.tyndp.yaml +++ b/config/test/config.tyndp.yaml @@ -437,7 +437,7 @@ cba: - 2040 cba_scenario_input: use_presolved: false - sb_version: latest # currently only latest is supported + sb_version: latest # use 'latest' or a supported version from data/versions.csv for pre-solved SB network input in CBA; only applies if use_presolved is true methods: - toot - pint From 71f2c2675aba4c84f6f403b7bb4ddb99ead94d38 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Tue, 21 Jul 2026 09:28:45 +0200 Subject: [PATCH 10/19] fix: skip attach functions if ppl is empty --- scripts/add_electricity.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 119b8f681c..2461e9ca68 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -571,6 +571,9 @@ def attach_wind_and_solar( Planning horizon for which renewable profiles should be added. Optional input defaults to None. If year is part of the coordinates and planning_horizon is None, then the first year is used by default. """ + if ppl.empty: + return + add_missing_carriers(n, carriers) if landfall_lengths is None: @@ -717,6 +720,9 @@ def attach_conventional_generators( fuel_price : pd.DataFrame, optional DataFrame containing fuel price data, by default None. """ + if ppl.empty: + return + carriers = list( set(conventional_carriers) | set(extendable_carriers["Generator"]) - set(renewable_carriers) @@ -808,6 +814,9 @@ def attach_existing_batteries( ppl: pd.DataFrame, ) -> None: """Attach existing battery storage units from the power plant dataset.""" + if ppl.empty: + return + batt = ppl.query('carrier == "battery"') if batt.empty: return @@ -868,6 +877,9 @@ def attach_hydro( **params : Additional parameters for hydro units. """ + if ppl.empty: + return + add_missing_carriers(n, carriers) add_co2_emissions(n, costs, carriers) From ff54e069de978bfaf5918199d55f7d847228dad4 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Tue, 21 Jul 2026 09:44:32 +0200 Subject: [PATCH 11/19] fix: use branch attributes in order --- rules/build_sector.smk | 9 ++++----- rules/postprocess.smk | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 423cf137ef..f628e45e1f 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -831,7 +831,7 @@ rule build_energy_totals: input: nuts3_shapes=resources("nuts3_shapes.geojson"), co2=branch( - rules.retrieve_ghg_emissions.output["csv"], config_provider("co2_budget") + config_provider("co2_budget"), rules.retrieve_ghg_emissions.output["csv"] ), swiss=resources("switzerland_energy_balances.csv"), swiss_transport=f"{BFS_ROAD_VEHICLE_STOCK_DATASET['folder']}/vehicle_stock.csv", @@ -1742,10 +1742,10 @@ rule prepare_sector_network: resources("residential_heat_dsm_profile_total_base_s_{clusters}.csv"), ), co2_totals_name=branch( - resources("co2_totals.csv"), config_provider("co2_budget") + config_provider("co2_budget"), resources("co2_totals.csv") ), co2=branch( - rules.retrieve_ghg_emissions.output["csv"], config_provider("co2_budget") + config_provider("co2_budget"), rules.retrieve_ghg_emissions.output["csv"] ), biomass_potentials=resources( "biomass_potentials_s_{clusters}_{planning_horizons}.csv" @@ -1757,8 +1757,7 @@ rule prepare_sector_network: ), h2_cavern=branch( config_provider("sector", "h2_topology_tyndp"), - None, - resources("salt_cavern_potentials_s_{clusters}.csv"), + otherwise=resources("salt_cavern_potentials_s_{clusters}.csv"), ), busmap_s=resources("busmap_base_s.csv"), busmap=resources("busmap_base_s_{clusters}.csv"), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 08ef6726ad..f03e6558b8 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -469,7 +469,7 @@ rule plot_summary: balances=RESULTS + "csvs/energy_balance.csv", eurostat=resources("eurostat_energy_balances.csv"), co2=branch( - rules.retrieve_ghg_emissions.output["csv"], config_provider("co2_budget") + config_provider("co2_budget"), rules.retrieve_ghg_emissions.output["csv"] ), output: costs=RESULTS + "graphs/costs.pdf", From 2475c9d9b0ffb426a633edf85696d79df1eb6ab1 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Tue, 21 Jul 2026 09:45:03 +0200 Subject: [PATCH 12/19] refactor: simplify multiple conditions --- rules/build_electricity.smk | 13 ++++--------- rules/build_sector.smk | 12 ++++-------- rules/solve_myopic.smk | 13 ++++--------- scripts/add_existing_baseyear.py | 9 ++++----- scripts/prepare_sector_network.py | 19 +++++++++---------- 5 files changed, 25 insertions(+), 41 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 5fd6f8f287..695f6583c3 100755 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -816,15 +816,10 @@ rule add_electricity: f"costs_{config_provider('costs', 'year')(w)}_processed.csv" ), regions=resources("regions_onshore_base_s_{clusters}.geojson"), - powerplants=lambda w: ( - resources("powerplants_s_{clusters}.csv") - if ( - config_provider("electricity", "conventional_carriers")(w) - or config_provider("electricity", "extendable_carriers", "Generator")( - w - ) - ) - else [] + powerplants=branch( + lambda w: config_provider("electricity", "conventional_carriers")(w) + or config_provider("electricity", "extendable_carriers", "Generator")(w), + resources("powerplants_s_{clusters}.csv"), ), hydro_capacities=ancient("data/hydro_capacities.csv"), unit_commitment="data/unit_commitment.csv", diff --git a/rules/build_sector.smk b/rules/build_sector.smk index f628e45e1f..4fa2e974ea 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1649,14 +1649,10 @@ def input_pemmdb_data(w): def input_gas_network(w): inputs = {} - def include_gas_network(w): - return config_provider("sector", "gas_network")(w) or config_provider( - "sector", "H2_retrofit" - )(w) - - inputs["clustered_gas_network"] = ( - resources("gas_network_base_s_{clusters}.csv") if include_gas_network else None - ) + if config_provider("sector", "gas_network")(w) or config_provider( + "sector", "H2_retrofit" + )(w): + inputs["clustered_gas_network"] = resources("gas_network_base_s_{clusters}.csv") if config_provider("sector", "gas_network")(w) or ( config_provider("sector", "imports", "enable")(w) diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 9a478c7ff3..24f72e4689 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -10,15 +10,10 @@ rule add_existing_baseyear: network=resources( "networks/base_s_{clusters}_{opts}_{sector_opts}_{planning_horizons}.nc" ), - powerplants=lambda w: ( - resources("powerplants_s_{clusters}.csv") - if ( - config_provider("electricity", "conventional_carriers")(w) - or config_provider("electricity", "extendable_carriers", "Generator")( - w - ) - ) - else [] + powerplants=branch( + lambda w: config_provider("electricity", "conventional_carriers")(w) + or config_provider("electricity", "extendable_carriers", "Generator")(w), + resources("powerplants_s_{clusters}.csv"), ), costs=lambda w: resources( f"costs_{config_provider('scenario', 'planning_horizons',0)(w)}_processed.csv" diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index e0ae5333df..f861752411 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -208,11 +208,10 @@ def add_power_capacities_installed_before_baseyear( """ logger.debug(f"Adding power capacities installed before {baseyear}") - df_agg = ( - pd.read_csv(powerplants_file, index_col=0) - if powerplants_file - else pd.DataFrame() - ) + if not powerplants_file: + return + + df_agg = pd.read_csv(powerplants_file, index_col=0) rename_fuel = { "Hard Coal": "coal", diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 48af26f6a0..36dec1e5c5 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -9978,7 +9978,7 @@ def add_hydro_tyndp( h2_pipes_file=snakemake.input.h2_grid_tyndp, interzonal_file=snakemake.input.interzonal_prepped, cavern_types=snakemake.params.sector["hydrogen_underground_storage_locations"], - clustered_gas_network_file=snakemake.input.clustered_gas_network, + clustered_gas_network_file=snakemake.input.get("clustered_gas_network"), gas_input_nodes=gas_input_nodes, spatial=spatial, options=options, @@ -10230,15 +10230,14 @@ def add_hydro_tyndp( limit = co2_cap.loc[investment_year] else: limit = get(co2_budget, investment_year) - if limit: - add_co2limit( - n, - options, - snakemake.input.co2_totals_name, - snakemake.params.countries, - nyears, - limit, - ) + add_co2limit( + n, + options, + snakemake.input.get("co2_totals_name"), + snakemake.params.get("countries"), + nyears, + limit, + ) maxext = snakemake.params["lines"]["max_extension"] if maxext is not None: From 932a7eab233e27cec2965b0aad581d8130c346fd Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Tue, 21 Jul 2026 11:38:10 +0200 Subject: [PATCH 13/19] doc: add release note --- doc/release_notes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/release_notes.md b/doc/release_notes.md index 137e6c7e27..df25b82e05 100644 --- a/doc/release_notes.md +++ b/doc/release_notes.md @@ -70,8 +70,9 @@ * Add sanitization of CLI inputs passed to `launch_explorer` ([#776](https://github.com/open-energy-transition/open-tyndp/pull/776)). -* Disentangle the `data/versions.csv` file by introducing `data/tyndp_versions.csv` ([#788](https://github.com/open-energy-transition/open-tyndp/pull/788)). All the TYNDP-specific version entries, as well as the `tyndp-archive` entries, are now tracked in this dedicated file. +* Disentangle the `data/versions.csv` file by introducing `data/tyndp_versions.csv` ([#788](https://github.com/open-energy-transition/open-tyndp/pull/788)). All the TYNDP-specific version entries, as well as the `tyndp-archive` entries, are now tracked in this dedicated file. +* Use `combine_indicators` instead of `collect_indicators` in the function `summary_benchmark_indicators` ([#797](https://github.com/open-energy-transition/open-tyndp/pull/797)). ## Upcoming PyPSA-Eur Release From 9452bfe9e4fc542deabdfc29dc76c857c19820ad Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Tue, 21 Jul 2026 11:45:17 +0200 Subject: [PATCH 14/19] doc: add release note --- doc/release_notes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/release_notes.md b/doc/release_notes.md index df25b82e05..4a3d62f247 100644 --- a/doc/release_notes.md +++ b/doc/release_notes.md @@ -74,6 +74,9 @@ * Use `combine_indicators` instead of `collect_indicators` in the function `summary_benchmark_indicators` ([#797](https://github.com/open-energy-transition/open-tyndp/pull/797)). +* Reduce dependency on upstream retrieves ([#798](https://github.com/open-energy-transition/open-tyndp/pull/798)). + + ## Upcoming PyPSA-Eur Release * feat: data version CSV / YAML file can be specified separately or extended by the user in the `data.version_files` config entry ([#2016](https://github.com/PyPSA/pypsa-eur/issues/2016)). From fba84bdba7476f4ddf31c62a95030c6d4c990edd Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Wed, 29 Jul 2026 11:08:06 +0200 Subject: [PATCH 15/19] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Rüdt <117752024+daniel-rdt@users.noreply.github.com> --- rules/build_electricity.smk | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 695f6583c3..c3d46d421e 100755 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -818,7 +818,17 @@ rule add_electricity: regions=resources("regions_onshore_base_s_{clusters}.geojson"), powerplants=branch( lambda w: config_provider("electricity", "conventional_carriers")(w) - or config_provider("electricity", "extendable_carriers", "Generator")(w), + or config_provider("electricity", "extendable_carriers", "Generator")(w) + or ( + config_provider( + "electricity", "estimate_renewable_capacities", "enable" + )(w) + and config_provider( + "electricity", + "estimate_renewable_capacities", + "from_powerplantmatching", + )(w) + ), resources("powerplants_s_{clusters}.csv"), ), hydro_capacities=ancient("data/hydro_capacities.csv"), From 4a70d877d0efe7eb691268af4af132357fd69167 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Wed, 29 Jul 2026 11:08:42 +0200 Subject: [PATCH 16/19] Apply suggestions from code review Co-authored-by: Thomas Gilon --- rules/build_sector.smk | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 4fa2e974ea..e3f1eee215 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1649,24 +1649,23 @@ def input_pemmdb_data(w): def input_gas_network(w): inputs = {} - if config_provider("sector", "gas_network")(w) or config_provider( - "sector", "H2_retrofit" - )(w): + gas_network = config_provider("sector", "gas_network")(w) + h2_retrofit = config_provider("sector", "H2_retrofit")(w) + imports_enabled = config_provider("sector", "imports", "enable")(w) + import_carriers = config_provider("sector", "imports", "carriers")(w) + h2_topology_tyndp = config_provider("sector", "h2_topology_tyndp")(w) + + if gas_network or h2_retrofit: inputs["clustered_gas_network"] = resources("gas_network_base_s_{clusters}.csv") - if config_provider("sector", "gas_network")(w) or ( - config_provider("sector", "imports", "enable")(w) - and ( - "gas" in config_provider("sector", "imports", "carriers")(w) - or ( - "H2" in config_provider("sector", "imports", "carriers")(w) - and not config_provider("sector", "h2_topology_tyndp")(w) - ) - ) - ): + gas_imports = "gas" in import_carriers + h2_imports_not_tyndp = "H2" in import_carriers and not h2_topology_tyndp + + if gas_network or (imports_enabled and (gas_imports or h2_imports_not_tyndp)): inputs["gas_input_nodes_simplified"] = resources( "gas_input_locations_s_{clusters}_simplified.csv" ) + return inputs From 74c7393f406f16955b40e7aab4fe29ccb86f4068 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Wed, 29 Jul 2026 09:40:52 +0200 Subject: [PATCH 17/19] refactor: remove depracated versions that were never used --- data/tyndp_versions.csv | 7 ------- 1 file changed, 7 deletions(-) diff --git a/data/tyndp_versions.csv b/data/tyndp_versions.csv index db03e6b427..98b0fde869 100644 --- a/data/tyndp_versions.csv +++ b/data/tyndp_versions.csv @@ -10,7 +10,6 @@ co2stop,26-august-2020,tyndp-archive,latest supported,2026-05-08,,https://storag copernicus_land_cover,v3.0.1,tyndp-archive,latest supported,2026-05-08,"The primary is already from Zenodo, documentation in https://zenodo.org/records/4723921",https://storage.googleapis.com/open-tyndp-data-store/archive/eur/copernicus_land_cover/v3.0.1 corine,v18_5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/corine/v18_5/corine.zip costs,v0.14.0,tyndp-archive,latest supported,2026-05-08,Part of the `technologydata` repository and versioned on GitHub.,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/costs/v0.14.0 -country_hdd,2025-08-13,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/country_hdd/2025-08-13/era5-HDD-per-country.csv country_runoff,2025-08-13,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/country_runoff/2025-08-13/era5-runoff-per-country.csv desnz_electricity_consumption,2026-02-16,tyndp-archive,latest supported,2026-02-16,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/desnz_electricity_consumption/2026-02-16/Subnational_electricity_consumption_statistics_2005-2024.xlsx dh_areas,341.5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/dh_areas/341.5/dh_areas.gpkg @@ -24,12 +23,9 @@ eurostat_balances,2026-02,tyndp-archive,latest supported,2026-05-08,,https://sto eurostat_household_balances,2025-07-09,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/eurostat_household_balances/2025-07-09/nrg_d_hhq.csv gdp_per_capita,2018-02-06,tyndp-archive,latest supported,2026-05-08,"Primary link is a direct download, earlier part of zenodo bundle",https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gdp_per_capita/2018-02-06/GDP_per_capita_PPP_1990_2015_v2.nc gebco,2014,tyndp-archive,latest supported,2026-05-08,Earlier part of databundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gebco/2014/GEBCO_2014_2D.nc -gem_europe_gas_tracker,may-2024,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_europe_gas_tracker/may-2024/Europe-Gas-Tracker-2024-05.xlsx gem_gcct,july-2025,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_gcct/july-2025/Global-Cement-and-Concrete-Tracker_July-2025.xlsx gem_gspt,march-2025-v1.1,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/gem_gspt/march-2025-v1.1/Plant-level-data-Global-Iron-and-Steel-Tracker-March-2025-V1.1.xlsx geothermal_heat_utilisation_potentials,341.5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/geothermal_heat_utilisation_potentials/341.5/Results_DH_Matching_Cluster.xlsx -ghg_emissions,v23,tyndp-archive,deprecated not-supported,2026-05-08,earlier part of databundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ghg_emissions/v23/UNFCCC_v23.csv -h2_salt_caverns,16-10-2019,tyndp-archive,deprecated not-supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/h2_salt_caverns/16-10-2019/h2_salt_caverns_GWh_per_sqkm.geojson hotmaps_industrial_sites,version-1.1,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/hotmaps_industrial_sites/version-1.1/Industrial_Database.csv jrc_ardeco,2021,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/jrc_ardeco/2021 jrc_energy_atlas,2026-02-16,tyndp-archive,latest supported,2026-02-16,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/jrc_energy_atlas/2026-02-16/electricity_tot_demand_2019.tif @@ -42,7 +38,6 @@ neso_electricity_demand,2026-02-02,tyndp-archive,latest supported,2026-05-08,,ht nitrogen_statistics,2023,tyndp-archive,latest supported,2026-02-26,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/nitrogen_statistics/2023/nitro-ert.xlsx nitrogen_statistics,2022,tyndp-archive,supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/nitrogen_statistics/2022/nitro-ert.xlsx nuts3_population,13-03-2025,tyndp-archive,latest supported,2026-05-08,earlier part of zenodo bundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/nuts3_population/13-03-2025/nama_10r_3popgdp.tsv.gz -ons_lad,may-2024,tyndp-archive,deprecated not-supported,2026-02-17,API request used,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ons_lad/may-2024/Local_Authority_Districts_May_2024_Boundaries__UK_BSC.geojson open_tyndp_prelim,0.7.1,primary,not-supported,2026-06-02,Open-TYNDP preliminary outcomes,https://zenodo.org/records/20303009 open_tyndp_prelim,0.7.1,archive,latest supported,2026-06-02,Open-TYNDP preliminary outcomes (results-0.7.1.zip),https://zenodo.org/records/20303009/files/results-0.7.1.zip open_tyndp_prelim,0.7.1,tyndp-archive,latest supported,2026-06-02,Open-TYNDP preliminary outcomes (results-0.7.1.zip),https://storage.googleapis.com/open-tyndp-data-store/outcomes/0.7.1/results-0.7.1.zip @@ -59,8 +54,6 @@ opsd_electricity_demand,2026-02-02,tyndp-archive,latest supported,2026-05-08,,ht osm,0.7,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/osm/0.7 osm_boundaries,unknown,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/osm_boundaries/unknown/osm_boundaries.zip population_count,2018-11-01,tyndp-archive,latest supported,2026-05-08,earlier part of zenodo bundle,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/population_count/2018-11-01/ppp_2019_1km_Aggregated.tif -powerplants,0.8.1,tyndp-archive,deprecated not-supported,2026-05-08,Part of the `powerplantmatching` package and versioned on GitHub.,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/powerplants/0.8.1/powerplants.csv -scigrid_gas,1.1.2,tyndp-archive,deprecated not-supported,2026-05-08,the primary is already from Zenodo published by original authors,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/scigrid_gas/1.1.2/IGGIELGN.zip seawater_temperature,v1.0,tyndp-archive,latest supported,2026-05-08,Test cutout seawater temperature,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/seawater_temperature/v1.0/seawater_temperature.nc ship_raster,v5,tyndp-archive,latest supported,2026-05-08,,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/ship_raster/v5/shipdensity_global.zip synthetic_electricity_demand,v2,tyndp-archive,latest supported,2026-05-08,the primary is already from Zenodo published by original authors,https://storage.googleapis.com/open-tyndp-data-store/archive/eur/synthetic_electricity_demand/v2/demand_hourly.csv From ba3ce9b0e83d0399f115307adccb187816ac1739 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Wed, 29 Jul 2026 11:15:53 +0200 Subject: [PATCH 18/19] feat: extend condition on add_existing_baseyear to solve_perfect --- rules/solve_perfect.smk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 7e44377827..d2653d307b 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -8,7 +8,11 @@ rule add_existing_baseyear: network=resources( "networks/base_s_{clusters}_{opts}_{sector_opts}_{planning_horizons}.nc" ), - powerplants=resources("powerplants_s_{clusters}.csv"), + powerplants=branch( + lambda w: config_provider("electricity", "conventional_carriers")(w) + or config_provider("electricity", "extendable_carriers", "Generator")(w), + resources("powerplants_s_{clusters}.csv"), + ), busmap_s=resources("busmap_base_s.csv"), busmap=resources("busmap_base_s_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_base_s_{clusters}.csv"), From 431e83c7a348f1754a059fc87c9215d66875bd55 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Wed, 29 Jul 2026 17:05:21 +0200 Subject: [PATCH 19/19] fix: fix input_gas_network conditions when no carriers --- rules/build_sector.smk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index e3f1eee215..5fa4e7ff26 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1658,10 +1658,12 @@ def input_gas_network(w): if gas_network or h2_retrofit: inputs["clustered_gas_network"] = resources("gas_network_base_s_{clusters}.csv") - gas_imports = "gas" in import_carriers - h2_imports_not_tyndp = "H2" in import_carriers and not h2_topology_tyndp + gas_imports = imports_enabled and "gas" in import_carriers + h2_imports_not_tyndp = ( + imports_enabled and "H2" in import_carriers and not h2_topology_tyndp + ) - if gas_network or (imports_enabled and (gas_imports or h2_imports_not_tyndp)): + if gas_network or gas_imports or h2_imports_not_tyndp: inputs["gas_input_nodes_simplified"] = resources( "gas_input_locations_s_{clusters}_simplified.csv" )