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: 6 additions & 0 deletions data/input/metadata_index.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@
]
},
"emissions": {
"elec_emission_source" : [
"Marginal (Cambium, Long-run)",
"Marginal (Cambium, Short-run)",
"Average (Cambium)",
"Constant (User-provided)"
],
"year": [
2025,
2030,
Expand Down
2 changes: 1 addition & 1 deletion layout/charts.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def emissions_bar_chart():
dmc.MultiSelect(
id="emission-em-scen-dropdown",
data=_emission_scen_seed(), # will be overwritten dynamically
value=["em_scenario_a", "em_scenario_b", "em_scenario_c"],
value=["em_scenario_a", "em_scenario_b", "em_scenario_c", "em_scenario_d"],
placeholder="Emission Scenarios",
searchable=True,
clearable=True,
Expand Down
76 changes: 50 additions & 26 deletions layout/input.py
Original file line number Diff line number Diff line change
Expand Up @@ -1163,7 +1163,7 @@ def build_emissions_table(emission_data, active_ids=None, view_mode="simple", un
view_mode: One of "simple", "advanced", or "differences"
unit_mode: "SI" or "IP" for unit conversion
"""
from utils.units import get_unit_converter, get_unit_label
from utils.units import get_converter, get_display_unit

emission_df = pd.DataFrame(emission_data) if isinstance(emission_data, list) else emission_data

Expand All @@ -1181,16 +1181,22 @@ def build_emissions_table(emission_data, active_ids=None, view_mode="simple", un
# Sort for stable column order
emission_df = emission_df.sort_values("em_scen_id").reset_index(drop=True)

# Get unit label for NG emission rate (dynamic based on unit_mode)
ng_emission_rate_unit = get_unit_label("emissions_rate", unit_mode)
# Get unit label for emission rates (dynamic based on unit_mode)
ng_emission_rate_unit = get_display_unit("gas_emission_factor", unit_mode)
elec_emission_rate_unit = get_display_unit("emissions_rate", unit_mode)

# Rows to display (property name, label)
# Note: em_scen_id is excluded as it's shown in the header
row_config = [
("em_scen_name", "Scenario"),
("elec_emission_source", "Grid emissions source"),
(
"elec_avg_emission_rate_gCO2e_per_kWh",
f"Constant grid emissions rate ({elec_emission_rate_unit})",
),
("grid_scenario", "Grid Scenario"),
("gea_grid_region", "GEA Grid Region"),
("emission_type", "Emission Type"),
("shortrun_weighting", "Short-run weighting"),
("annual_refrig_leakage_percent", "Refrigerant leakage (frac)"),
(
"ng_emission_rate_gCO2e_per_kWh",
Expand Down Expand Up @@ -1319,8 +1325,9 @@ def build_emissions_table(emission_data, active_ids=None, view_mode="simple", un
# ---------- Property rows ----------
diff_row_style = TABLE_STYLE.diff_row_style

# Get converter for NG emission rate values
ng_emission_rate_converter = get_unit_converter("emissions_rate", unit_mode)
# Get converter for emission rate values
ng_emission_rate_converter = get_converter("gas_emission_factor", unit_mode)
elec_emission_rate_converter = get_converter("emissions_rate", unit_mode)

for field, label in available_rows:
is_diff_row = field in diff_fields
Expand All @@ -1335,13 +1342,19 @@ def build_emissions_table(emission_data, active_ids=None, view_mode="simple", un
for idx, scen_id in enumerate(scen_ids):
raw_value = emission_df.iloc[idx].get(field, "")

# Apply unit conversion for NG emission rate
# Apply unit conversion for emission rates
if field == "ng_emission_rate_gCO2e_per_kWh" and raw_value is not None:
try:
converted = ng_emission_rate_converter(float(raw_value))
display_value = f"{converted:.2f}"
except (ValueError, TypeError):
display_value = format_table_value(raw_value, field_name=field)
elif field == "elec_avg_emission_rate_gCO2e_per_kWh" and raw_value is not None:
try:
converted = elec_emission_rate_converter(float(raw_value))
display_value = f"{converted:.2f}"
except (ValueError, TypeError):
display_value = format_table_value(raw_value, field_name=field)
else:
display_value = format_table_value(raw_value, field_name=field)

Expand Down Expand Up @@ -1910,6 +1923,36 @@ def _options(values):
],
grow=True,
),
dmc.SimpleGrid(
cols=2,
spacing="md",
children=[
dmc.Select(
id="edit-em-elec-source",
label="Grid emissions source",
placeholder="Select grid emissions source",
data=_options(emissions_index["elec_emission_source"]),
searchable=True,
clearable=False,
),
dmc.Stack(
[
dmc.Text(
id="edit-em-elec-emission-rate-label",
children="Constant grid emissions rate (g/kWh)",
size="sm",
fw=500,
),
dmc.NumberInput(
id="edit-em-elec-avg-emission-rate",
min=0,
step=1,
),
],
gap=4,
),
],
),
dmc.SimpleGrid(
cols=2,
spacing="md",
Expand All @@ -1936,12 +1979,6 @@ def _options(values):
cols=2,
spacing="md",
children=[
dmc.TextInput(
id="edit-em-time-zone",
label="Time zone",
placeholder="e.g. America/Los_Angeles",
disabled=True,
),
dmc.Select(
id="edit-em-emission-type",
label="Emission type",
Expand All @@ -1950,19 +1987,6 @@ def _options(values):
searchable=False,
clearable=False,
),
],
),
dmc.SimpleGrid(
cols=2,
spacing="md",
children=[
dmc.NumberInput(
id="edit-em-shortrun-weighting",
label="Short-run weighting",
min=0,
max=1,
step=0.1,
),
dmc.Select(
id="edit-em-year",
label="Year",
Expand Down
Loading
Loading