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
4 changes: 0 additions & 4 deletions pages/emissions_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,6 @@ def handle_emission_group_selection(group_id, metadata_data, selected_ids, store
"year": default_year,
}
)
# If the base was a Constant scenario it may have no grid_scenario; restore a
# sensible default so Cambium-based group variants don't fail validation.
if not base_scenario.get("grid_scenario"):
base_scenario["grid_scenario"] = "MidCase"

# Reset to default 2/3/4 scenarios (a, b, optionally c & d) with group-specific values
updated_scenarios = []
Expand Down
2 changes: 1 addition & 1 deletion src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class EmissionScenarioDefaults(Enum):
"""Default values for emission scenario parameters."""

ELEC_EMISSION_SOURCE: str = "Marginal (Cambium, Long-run)"
ELEC_AVG_EMISSION_RATE_G_KWH: float | None = None
ELEC_AVG_EMISSION_RATE_G_KWH: float = None
YEAR: int = 2025
REFRIGERANT_LEAKAGE: float = 0.02
EMISSION_TYPE: str = "Includes pre-combustion"
Expand Down
24 changes: 2 additions & 22 deletions src/emissions.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,16 @@
from pathlib import Path
from typing import Literal

import pandas as pd
from pydantic import BaseModel, model_validator
from pydantic import BaseModel

from src import paths
from src.mixins import DotAccessMixin

CAMBIUM_SOURCES = (
"Marginal (Cambium, Long-run)",
"Marginal (Cambium, Short-run)",
"Average (Cambium)",
)


class EmissionScenario(DotAccessMixin, BaseModel):
em_scen_id: str
em_scen_name: str
elec_emission_source: Literal[
"Marginal (Cambium, Long-run)",
"Marginal (Cambium, Short-run)",
"Average (Cambium)",
"Constant (User-provided)",
]
elec_emission_source: str
elec_avg_emission_rate_gCO2e_per_kWh: float | None = None
grid_scenario: str | None = None
gea_grid_region: str | None = None
Expand All @@ -31,14 +19,6 @@ class EmissionScenario(DotAccessMixin, BaseModel):
ng_emission_rate_gCO2e_per_kWh: float
year: int

@model_validator(mode="after")
def check_source_fields(self) -> "EmissionScenario":
if self.elec_emission_source in CAMBIUM_SOURCES and not self.grid_scenario:
raise ValueError(
f"grid_scenario is required for emission source '{self.elec_emission_source}'"
)
return self


class StandardEmissions:
"""
Expand Down
8 changes: 6 additions & 2 deletions src/energy.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import pandas as pd

from src.config import Columns as Col
from src.emissions import CAMBIUM_SOURCES, get_emissions_data
from src.emissions import get_emissions_data
from src.equipment import Equipment, EquipmentLibrary, PerformanceCurves
from src.loads import StandardLoad
from src.metadata import Metadata
Expand Down Expand Up @@ -1161,7 +1161,11 @@ def site_to_source(
base[Col.HOUR.value] = base.index.hour
base[Col.DOY.value] = base.index.dayofyear

if em_scen.elec_emission_source in CAMBIUM_SOURCES:
if em_scen.elec_emission_source in [
"Marginal (Cambium, Long-run)",
"Marginal (Cambium, Short-run)",
"Average (Cambium)",
]:
emissions_data = get_emissions_data(metadata[em_scen_id])
logger.debug(
f"Cambium grid emissions: Loaded {len(emissions_data.df)} emission data rows"
Expand Down