Skip to content

Project Config

TOML Example

################## Project data ####################

[project]
  name = "test1"  # A short name in one word as project identifier
  full_name = "Test Project 1"
  description = "This is the first test project for PIPES using some of the LA100 data and configs as a test case"
  assumptions = [
    "We can use LA100 as a test project for the C2C data pipeline.",
    "No effects of climate change on power system outside of increased demand for cooling are measured.",
    "LADWP will need to achieve a 100% clean energy by 2030 or 2045 completely on its own (e.g., no other utilities will be trading energy).",
    "Path to 100% is based off today's technology options.",
    "https://maps.nrel.gov/la100/la100-study/topics/renewable-energy-pathways#renewable-energy-pathways-assumptions"
  ]
  scheduled_start = "2022-09-27"
  scheduled_end = "2024-01-01"
  sensitivities = []

  [[project.milestones]]
    name = "Milestone 1"
    description = "First test project milestone"
    milestone_date = "2022-11-01"
  [[project.milestones]]
    name = "Milestone 2"
    description = "Second test project milestone"
    milestone_date = "2022-12-01"

  [project.owner] # who will be the main POC for the project?
    first_name = "Joe"
    last_name = "Shmo"
    email = "joe.shmo@nrel.gov"
    username = "jshmo"

  [project.requirements] # these are default requirements to be used unless otherwise specified at a project run level or for individual models
    weather_years = [2012]
    model_years = [2020, 2025, 2030, 2040, 2045]
    geographic_extent = "LA City"


  ################# project scenario data ####################

  [[project.scenarios]]
    name = "sb100_high"
    description = [
      "100% clean energy by 2045.",
      "Only scenario with a target based on retail sales, not generation.",
      "Evaluated under High Load Electrification."
      ]
  [project.scenarios.other]
    color = "#1BC1AF"

  [[project.scenarios]]
    name = "sb100_moderate"
    description = [
      "100% clean energy by 2045.",
      "Only scenario with a target based on retail sales, not generation.",
      "Evaluated under Moderate Load Electrification."]
  [project.scenarios.other]
    color = "#FA6504"

  [[project.scenarios]]
    name = "sb100_stress"
    description = [
      "100% clean energy by 2045.",
      "Only scenario with a target based on retail sales, not generation.",
      "Evaluated under High Stress Load Electrification."]
  [project.scenarios.other]
    color = "#5369E5"

  [[project.scenarios]]
    name = "earlynobio_high"
    description = [
      "100% clean energy by 2035, 10 years sooner than other scenarios.",
      "No natural gas generation or biofuels.",
      "Allows existing nuclear and upgrades to transmission.",
      "Evaluated under High Load Electrification."]

  [[project.scenarios]]
    name = "earlynobio_moderate"
    description = [
      "100% clean energy by 2035, 10 years sooner than other scenarios.",
      "No natural gas generation or biofuels.",
      "Allows existing nuclear and upgrades to transmission.",
      "Evaluated under Moderate Load Electrification."]

  [[project.scenarios]]
    name = "trans_high"
    description = [
      "100% clean energy by 2045.",
      "Only scenario that builds new transmission corridors.",
      "No natural gas or nuclear generation.",
      "Evaluated under High Load Electrification."]

  [[project.scenarios]]
    name = "trans_moderate"
    description = [
      "100% clean energy by 2045.",
      "Only scenario that builds new transmission corridors.",
      "No natural gas or nuclear generation.",
      "Evaluated under Moderate Load Electrification."]

  [[project.scenarios]]
    name = "ltdnewtrans_high"
    description = [
      "100% clean by 2045.",
      "Only scenario that does not allow upgrades to transmission beyond currently planned projects.",
      "No natural gas or nuclear generation.",
      "Evaluated under High Load Electrification."]

  [[project.scenarios]]
    name = "ltdnewtrans_moderate"
    description = [
      "100% clean by 2045.",
      "Only scenario that does not allow upgrades to transmission beyond currently planned projects.",
      "No natural gas or nuclear generation.",
      "Evaluated under Moderate Load Electrification."]


  ######## pipeline data ################

  # -------- Run 1 --------
  [[project_runs]]
    name = "1"
    description = "Single scenario, single year, simple test"
    assumptions = ["The single scenario, single year, simple tests assumes 1 scenario and 1 model year at the project run level which is different than the project level. The project run also has 2 models with one edge. Each model has its own example of a different model requirement for geographic_extent compared to the run-level."]
    scenarios = ["earlynobio_moderate"]
    scheduled_start = "2022-09-27"
    scheduled_end = "2022-10-15"

  [project_runs.requirements] # these become the new requirements for all datasets in this run
    model_years = [2020]

  [[project_runs.models]]
    model = "dsgrid"
    type = "Energy Demand" # This is used in pipeline as header to represent the category of model
    description = "The Demand-Side Grid Model used for LA100 project Run 1"
    assumptions = ["This is a dsgrid assumption"]
    expected_scenarios = ["demand_moderate"] # scenarios we're expecting the model to checkin datasets under
    scheduled_start = "2022-09-28"
    scheduled_end = "2022-10-05"

  [[project_runs.models.scenario_mappings]] # need to check that either all project scenarios are accounted for or that all project_run scenarios are accounted for if models.scenario_mappings are provided
    model_scenario = "demand_moderate"
    project_scenarios = ["earlynobio_moderate"] # one model scenario can map to multiple project scenarios.
    description = [
      "30% of passenger cars on the road in 2045 are plug-in electric.",
      "Residential building equipment and appliance sales are distributed across all efficiency levels.",
      "80% of new & retrofit equipment is 5 years ahead of California's Title 24 commercial building energy-efficiency code-minimum.",
      "75% of residents have access to residential charging; 25% access to workplace charging."]

  [project_runs.models.requirements]  # model specific requirement that applies to this run
    geographic_extent = "RS-A"

  [[project_runs.models]]
    model = "rpm"
    type = "Capacity Expansion"
    description = "Resource Planning Model for LADWP and WECC from the LA100 Project"
    assumptions = ["LADWP is treated as an island"]
    expected_scenarios = ["earlynobio_moderate"]
    scheduled_start = "2022-10-05"
    scheduled_end = "2022-10-15"

  [project_runs.models.requirements]
    geographic_extent = "RS-C"

  [[project_runs.topology]]
    from_model = "dsgrid"
    to_model = "rpm"

    [[project_runs.topology.handoffs]]
    id = "handoff_id1"
    description = "8760 system-level load profiles, including T&D losses, before distributed generation, at the RS nodal level"
    scheduled_start = ""  # some date
    scheduled_end = "2023-06-30"  # *Required* some date
    notes = ""

    [[project_runs.topology.handoffs]]
    id = "handoff_id2"
    description = "EV locations"
    scheduled_start = ""  # some date
    scheduled_end = "2023-07-10"  # *Required* some date
    notes = ""

  # -------- Run 2 --------
  [[project_runs]]
    name = "2"
    description = "full set of scenarios more complex test"
    assumptions = ["The full set of scenarios more complex test includes all project scenarios with two models having their own defintion that requires mappings back to the project level. This project run includes 3 models with more edges."]
    scenarios = [
      "sb100_moderate",
      "sb100_high",
      "sb100_stress",
      "earlynobio_high",
      "earlynobio_moderate",
      "trans_high",
      "trans_moderate",
      "ltdnewtrans_high",
      "ltdnewtrans_moderate"
    ]
    scheduled_start = "2022-10-20"
    scheduled_end = "2023-01-01"

    [project_runs.requirements]
    # Empty, inherits requirements from project

    [[project_runs.models]]
      model = "dsgrid"  # This must be unique
      model_team = "dsgrid"  # *optional* if this isn't provided, the associated model team is looked up via the "model" property above
      display_name = "dsGrid"  # *optional* A display name, if different than "model" property above
      type = "Energy Demand"
      description = "The Demand-Side Grid Model used for LA100 project as an example for PIPES Test Project 1 Run 2"
      expected_scenarios = ["demand_moderate", "demand_high", "demand_stress"]
      scheduled_start = "2022-10-20"
      scheduled_end = "2022-11-15"

      [project_runs.models.requirements]
      # None

      [[project_runs.models.scenario_mappings]]
        model_scenario = "demand_moderate"
        project_scenarios = ["earlynobio_moderate", "sb100_moderate", "trans_moderate", "ltdnewtrans_moderate"]
        description = [
          "30% of passenger cars on the road in 2045 are plug-in electric.",
          "Residential building equipment and appliance sales are distributed across all efficiency levels.",
          "80% of new & retrofit equipment is 5 years ahead of California's Title 24 commercial building energy-efficiency code-minimum.",
          "75% of residents have access to residential charging; 25% access to workplace charging."]

      [[project_runs.models.scenario_mappings]]
        model_scenario = "demand_high"
        project_scenarios = ["earlynobio_high", "sb100_high", "trans_high", "ltdnewtrans_high"]
        description = [
          "Appliances, heating within buildings switch from natural gas to electric.",
          "Residential building equipment and appliance sales are at highest efficiency available.",
          "80% of passenger cars on the road in 2045 are plug-in electric.",
          "60% of residents have access to residential charging; 50% access to workplace charging to encourage more daytime charging.",
          "Demand is more flexible in its timing."]

      [[project_runs.models.scenario_mappings]]
        model_scenario = "demand_stress"
        project_scenarios = ["sb100_stress"]
        description = [
          "All the electrification of High, but timing of demand is not aligned with renewable generation.",
          "Energy efficiency adoption is lower than Moderate (matches LADWPs 2017 Strategic Long Term Resource Plan 10-year efficiency goals).",
          "90% of residents have access to residential charging; 15% access to workplace charging to restrict daytime charging."]

      [project_runs.models.requirements]
      # None


    [[project_runs.models]]
      model = "dgen"
      type = "Distributed Generation Adoption"
      description = "The Distributed Generation Model (dGen) - A customer behind-the-meter adoption model for rooftop solar and distributed storage. Tuned for the LA100 project and used as an example for PIPES development."
      expected_scenarios = ["dg_moderate", "dg_high"]
      scheduled_start = "2022-11-15"
      scheduled_end = "2022-11-30"

      [project_runs.models.requirements]
      # None

      [[project_runs.models.scenario_mappings]]
        model_scenario = "dg_moderate"
        project_scenarios = ["sb100_moderate", "sb100_high", "sb100_stress", "trans_moderate", "trans_high"]
        description = "net energy billing"

      [[project_runs.models.scenario_mappings]]
        model_scenario = "dg_high"
        project_scenarios = ["earlynobio_moderate", "earlynobio_high", "ltdnewtrans_moderate", "ltdnewtrans_high"]
        description = "net energy metering"

    [[project_runs.models]] # Note: this model does not have any expected scenarios, so that means we expect all project-level scenarios
      model = "rpm"
      type = "Capacity Expansion"
      description = "Resource Planning Model for LADWP and WECC from the LA100 Project"
      assumptions = ["LADWP is treated as an island"]
      scheduled_start = "2022-11-30"
      scheduled_end = "2023-01-01"

      [project_runs.models.requirements]
      # None

      # Note: no scenario mappings needed because rpm here uses the project scenarios by default

    [[project_runs.topology]]
      from_model = "dsgrid"
      to_model = "rpm"
      [[project_runs.topology.handoffs]]
        id = "handoff_id3"
        description = "8760 system-level load profiles, including T&D losses, before distributed generation, at the RS nodal level, including gap-system level loads but not including load shifting from demand response."
        scheduled_start = ""  # some date
        scheduled_end = "2023-05-20"  # *Required* some date
        notes = ""

    [[project_runs.topology]]
      from_model = "dsgrid"
      to_model = "dgen"
      [[project_runs.topology.handoffs]]
        id = "handoff_id4"
        description = "8760 customer-level behind-the-meter load profiles (before distributed generation), at the agent level (i.e., property level). Includes residential building, commercial building, industrial, and gap-agent loads plus transportation of electric vehicles."
        scheduled_start = ""  # some date
        scheduled_end = "2023-05-21"  # *Required* some date
        notes = ""

    [[project_runs.topology]]
      from_model = "dgen"
      to_model = "rpm"
      [[project_runs.topology.handoffs]]
        id = "handoff_id5"
        description = "Includes distributed PV generation 8760s at the RS nodal level for each dg scenario."
        scheduled_start = ""  # some date
        scheduled_end = "2023-09-30"  # *Required* some date
        notes = ""


##################### modeling teams #####################
[[model_teams]]
  name = "dsgrid"

  [[model_teams.members]]
  first_name = "Sam"
  last_name = "Molnar"
  email = "sam.molnar@nrel.gov"
  username = "smolnar"

  [[model_teams.members]]
  first_name = "Meghan"
  last_name = "Mooney"
  email = "Meghan.Mooney@nrel.gov"
  username = "mmooney"

[[model_teams]]
  name = "dgen"

  [[model_teams.members]]
  first_name = "Jianli"
  last_name = "Gu"
  email = "Jianli.Gu@nrel.gov"
  username = "jgu2"

  [[model_teams.members]]
  first_name = "Jacob"
  last_name = "Nunemaker"
  email = "Jacob.Nunemaker@nrel.gov"
  username = "jnunemak"

[[model_teams]]
  name = "rpm"

  [[model_teams.members]]
  first_name = "Kenny"
  last_name = "Gruchalla"
  email = "Kenny.Gruchalla@nrel.gov"
  username = "kgruchal"

  [[model_teams.members]]
  first_name = "David"
  last_name = "Rager"
  email = "David.Rager@nrel.gov"
  username = "drager"

Schema Reference

The Project config initializes the project, including schemas of project, project run, and model requirements/scenarios/assumptions/scheduling.

schemas

ProjectCreate

Attributes:

Name Type Description
assumptions list[str]
description str
leads set[UserCreate]
milestones list[Milestone]
name str
owner UserCreate
requirements dict
scenarios list[Scenario]
scheduled_end datetime
scheduled_start datetime
sensitivities list[Sensitivity]
title str

assumptions = Field(title='assumptions', default=[], description='project assumptions')

description = Field(title='description', default='', description='project description')

leads = Field(title='leads', default=[], description='list of project lead')

milestones = Field(title='milestones', default=[], description='project milestones')

name = Field(title='name', min_length=1, description='human-readable project id name, must be unique.')

owner = Field(title='owner', description='project owner')

requirements = Field(title='requirements', default={}, description='project requirements')

scenarios = Field(title='scenarios', default=[], description='project scenarios')

scheduled_end = Field(title='scheduled_end', description='format YYYY-MM-DD')

scheduled_start = Field(title='scheduled_start', description='project start datetime, format YYYY-MM-DD')

sensitivities = Field(title='sensitivities', default=[], description='project sensitivities')

title = Field(title='title', default='', description='Project title')

Milestone

Attributes:

Name Type Description
description str
milestone_date datetime
name str

description = Field(title='description', description='description of milestone')

milestone_date = Field(title='milestone_date', description='format YYYY-MM-DD, it must be within the dates of the project.')

name = Field(title='name', description='milestone name must be unique from each other.')

Scenario

Attributes:

Name Type Description
description list[str]
name str
other dict

description = Field(title='description', default='', description='scenario description')

name = Field(title='name', description='scenario name')

other = Field(title='other', default={}, description='other properties applied to scenario')

Sensitivity

Attributes:

Name Type Description
description list[str]
name str

description = Field(titleee='description', description='sensitivity description')

name = Field(title='name', description='sensitivity name')

schemas

ProjectRunCreate

Attributes:

Name Type Description
assumptions list[str]
description str
name str
requirements dict
scenarios list[str]
scheduled_end datetime
scheduled_start datetime

assumptions = Field(title='assumptions', description='Assumptions associated with project run that differ from project', default=[])

description = Field(title='description', description='the description of this project run', default='')

name = Field(title='name', min_length=1, description='Project run name')

requirements = Field(title='requirements', description='Requirements of the project run that differ from the project', default={})

scenarios = Field(title='scenarios', description='the scenarios of this prject run', default=[])

scheduled_end = Field(title='scheduled_end', description='Schedule project run end date in YYYY-MM-DD format')

scheduled_start = Field(title='scheduled_start', description='Schedule project run start date in YYYY-MM-DD format')

schemas

ModelCreate

Model schema

Attributes:

Name Type Description
assumptions list[str]
description list[str]
display_name str | None
expected_scenarios list[str]
modeling_team str
name str
other dict
requirements dict
scenario_mappings list[ScenarioMapping]
scheduled_end datetime
scheduled_start datetime
type str

assumptions = Field(title='assumptions', description='List of model assumptions', default=[])

description = Field(title='description', description='Description of the model')

display_name = Field(title='display_name', default=None, description='Display name for this model vertex.')

expected_scenarios = Field(title='assumptions', description='List of expected model scenarios', default=[])

modeling_team = Field(title='modeling_team', description='Which modeling team to link this model to.')

name = Field(title='model', min_length=1, description='the model name')

other = Field(title='other', default={}, description='other metadata info about the model in dictionary')

requirements = Field(title='requirements', default={}, description='Model specific requirements (if different from Project and Project-Run)')

scenario_mappings = Field(title='scenario_mappings', description='Model scenarios (if different) and how they map to the project scenarios', default=[])

scheduled_end = Field(title='scheduled_end', description='Schedule model end date in YYYY-MM-DD format')

scheduled_start = Field(title='scheduled_start', description='Schedule model start date in YYYY-MM-DD format')

type = Field(title='type', description="Type of model to use in graphic headers (e.g, 'Capacity Expansion')")

ScenarioMapping

Mapping model scenario to project scenarios

Attributes:

Name Type Description
description list[str]
model_scenario str
other dict
project_scenarios list[str]

description = Field(title='description', default=[], description='Model scenario description')

model_scenario = Field(title='model_scenario', description='The model scenario name')

other = Field(title='other', default={}, description='other metadata info about the model scenario mapping in dictionary')

project_scenarios = Field(title='project_scenarios', description='List of project scenario names that the model scenario maps to')

schemas

TeamCreate

Attributes:

Name Type Description
description str | None
members list[UserCreate]
name str

description = Field(title='description', default=None, description='The team description')

members = Field(title='members', default=[], description='List of users')

name = Field(title='name', description='The team name')

schemas

UserCreate

User base model

Attributes:

Name Type Description
email EmailStr
first_name str | None
last_name str | None
organization str | None

email = Field(title='email', to_lower=True, description='Email address')

first_name = Field(title='first_name', default=None, description='First name')

last_name = Field(title='last_name', default=None, description='Last name')

organization = Field(title='organization', default=None, description='Organization name')