Skip to content
Open
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
140 changes: 109 additions & 31 deletions configuration/summary_configuration.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@
protected_namespaces = '()'

# run Quarto summary notebooks
run_run_comparison = false
run_RTP_summary = true

# annualization factor; continuing with value used from Vision 2050
weekday_to_annual = 320
run_validation = true
run_network_validation = true
run_run_comparison = false

#################################
# RELATIVE PATHS between notebooks and output/survey directories
Expand All @@ -21,6 +20,10 @@ p_output_dir = 'outputs/summary'
output_folder = 'outputs'
survey_folder = 'inputs/base_year/survey'

# annualization factor; continuing with value used from Vision 2050
weekday_to_annual = 320


#################################
# NETWORK SUMMARY
#################################
Expand Down Expand Up @@ -82,45 +85,34 @@ equity_geogs = ['equity_focus_areas_2023__efa_dis',
hh_equity_geogs = ['hh_efa_dis', 'hh_efa_older', 'hh_efa_lep', 'hh_efa_pov200', 'hh_efa_poc', 'hh_efa_youth']

#################################
# run summary notebooks
# model results
#################################

# run jupyter scripts
summary_list = ['topsheet',
'population',
'parking',
'vmt',
'transit']

RTP_summary_list = [
'RTP_index',
'RTP_congestion',
'RTP_topsheet',
'RTP_MIC',
'RTP_person',
'RTP_household',
'RTP_access',
'RTP_costs',
'RTP_walk_bike',
'RTP_emissions',
'RTP_mode_share',
'RTP_freight',
'RTP_transit',
# 'RTP_conformity_analysis'
]

# current run name and directory
sc_run_name = "current run"
sc_run_path = '../../../../'
# sc_run_name = "2023 base year"
# sc_run_path = '//modelstation2/c$/Workspace/sc_2023_06_24_25'
# sc_run_path = 'C:/workspace/sc_rtp_2035/soundcast'

#################################
# survey data for validation
#################################
# attach uncloned folder path when reading uncloned data
uncloned_folder = "uncloned"

# list all survey sources to be indluded in validation
[survey_directories]
# 2023 HTS dataset
"survey" = "../../../../inputs/base_year/survey"
# add another survey source to compare
# "(name of dataset)" = "R:/e2projects_two/2023_base_year/2017_2019_survey/test/cleaned/skims_attached"

# Summary Comparisons for summary-notebook: add comparison run directories
[comparison_runs_list]
'2050 new transit, old network' = '\\modelstation3\c$\Workspace\sc_new_2050_transit\soundcast'
'2050 urbansim' = '\\modelstation2\c$\Workspace\sc_2050_urbansim2_07_30_25'
# '2050 RTP' = 'L:\RTP_2022\final_runs\sc_rtp_2050_constrained_final_revised\soundcast'


#################################
# NETWORK SUMMARY
#################################
Expand Down Expand Up @@ -263,3 +255,89 @@ PM25 = "PM25 Total"
117 = "PM25 Tirewear"
118 = "Composite NonECPM"
119 = "H20 Aerosol"

[summary_list]
"RTP-summary-notebook" = [
'RTP_index',
'RTP_congestion',
'RTP_topsheet',
'RTP_MIC',
'RTP_person',
'RTP_household',
'RTP_access',
'RTP_costs',
'RTP_walk_bike',
'RTP_emissions',
'RTP_mode_share',
'RTP_freight',
'RTP_transit',
# 'RTP_conformity_analysis'
]
"activitysim-validation-notebook" = [
'work_from_home',
'auto_ownership', # household and tour data not working
'telecommute_frequency',
'free_parking',
'cdap',
'intermediate_stop_frequency',
'trip_purpose',
'trip_destination_choice',
'school_location',
'work_location',
'mandatory_tour_frequency',
'mandatory_tour_scheduling',
'non_mandatory_tour_frequency',
'non_mandatory_tour_destination_choice',
'non_mandatory_tour_scheduling',
'joint_tour_frequency',
'joint_tour_composition',
'atwork_subtours_frequency',
'atwork_subtours_destination_choice',
'atwork_subtours_scheduling',
'atwork_subtour_mode',
'tour_mode_choice',
'trip_mode_choice'
]
"daysim-validation-notebook" = [
'all_tour_mode',
'all_trip_mode',
'auto_ownership',
'day_pattern',
'escort_tour_mode',
'escort_trip_mode',
'households',
'intermediate_stop_generation',
'other_home_based_tour_mode',
'other_home_based_trip_mode',
'persons',
'school_location',
'school_tour_mode',
'school_trip_mode',
'telecommute',
'time_choice',
'tours',
'tour_destination',
'transit_pass_ownership',
'trips',
'trip_destination',
'workbased_subtour_generation',
'workbased_subtour_mode',
'work_location',
'work_tour_mode',
'work_trip_mode'
]
"network-validation-notebook" = [
'JBLM',
'supplementals',
'transit_validation',
'traffic_validation',
'bike_validation',
'link_analysis'
]
"run-comparison-notebook" = [
'topsheet',
'population',
'parking',
'vmt',
'transit'
]
6 changes: 2 additions & 4 deletions run_soundcast.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
from scripts.trucks import truck_model
from scripts.utils import update_parking
from scripts.utils import urbansim_skims
from scripts.summarize.create_quarto_notebooks import create_quarto_notebooks
from scripts.summarize.standard import (
daily_bank,
network_summary,
Expand Down Expand Up @@ -222,10 +223,7 @@ def run_all_summaries():
agg.main(state)
validation.main(state)
job_accessibility.main(state)
subprocess.run(
"conda activate summary && python scripts/summarize/create_quarto_notebooks.py && conda deactivate",
shell=True,
)
create_quarto_notebooks(state.input_settings, state.summary_settings)


def get_current_commit_hash():
Expand Down
65 changes: 50 additions & 15 deletions scripts/settings/state.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
from pydantic import BaseModel, validator, ConfigDict
from typing import List, Optional
import typing
from pydantic import BaseModel, ConfigDict
from pathlib import Path
import toml
import typing
import settings.run_args
import sys
import os
from sqlalchemy import create_engine

sys.path.append(os.path.join(os.getcwd(), "inputs"))
sys.path.append(os.path.join(os.getcwd(), "scripts"))
sys.path.append(os.getcwd())
from emme_project import EmmeProject

# from typing_extensions import Literal
PROJECT_ROOT = Path(__file__).resolve().parents[2]

# Ensure project-rooted imports work regardless of process working directory.
for _path in (PROJECT_ROOT, PROJECT_ROOT / "scripts", PROJECT_ROOT / "inputs"):
_path_str = str(_path)
if _path_str not in sys.path:
sys.path.append(_path_str)

class InputSettings(BaseModel):
# toml input notes:
Expand Down Expand Up @@ -309,6 +309,36 @@ class NetworkSettings(BaseModel):


class SummarySettings(BaseModel):
#################################
# Summary Comparisons
#################################
run_run_comparison: bool
run_RTP_summary: bool
run_validation: bool
run_network_validation: bool
#################################
# Run Summary Notebooks
#################################
summary_list: dict
#################################
# Reletive Paths
#################################
p_output_dir: str
output_folder: str
survey_folder: str
uncloned_folder: str
#################################
# model results
#################################
sc_run_name: str
sc_run_path: str
# all survey sources to be included in validation
survey_directories: dict
# add comparison run directories
comparison_runs_list: dict
#################################
# Other Data
#################################
county_map: dict
uc_list: list
agency_lookup: dict
Expand All @@ -318,10 +348,10 @@ class SummarySettings(BaseModel):
fac_type_lookup: dict
tod_lookup: dict
summer_list: list
pollutant_map: dict
special_route_lookup: dict



class State:
def __init__(
self,
Expand All @@ -344,6 +374,10 @@ def __init__(
self.conn = self.sqlite_connect()

def create_main_project(self):
# Import only when needed so settings-only consumers (e.g., notebooks)
# don't require Emme dependencies at module import time.
from scripts.emme_project import EmmeProject

self.main_project = EmmeProject(self.main_project_path, self.model_input_dir)

def name_from_main_project_path(self):
Expand All @@ -354,35 +388,36 @@ def name_from_main_project_path(self):
return res

def sqlite_connect(self):
conn = create_engine("sqlite:///inputs/db/" + self.input_settings.db_name)
db_path = PROJECT_ROOT / "inputs" / "db" / self.input_settings.db_name
conn = create_engine(f"sqlite:///{db_path.as_posix()}")
return conn


def generate_state(configs_dir):
# set up configs/settings:
if configs_dir is None:
config = toml.load(Path.cwd() / "configuration/input_configuration.toml")
emme_config = toml.load(Path.cwd() / "configuration/emme_configuration.toml")
config = toml.load(PROJECT_ROOT / "configuration/input_configuration.toml")
emme_config = toml.load(PROJECT_ROOT / "configuration/emme_configuration.toml")
network_config = toml.load(
Path.cwd() / "configuration/network_configuration.toml"
PROJECT_ROOT / "configuration/network_configuration.toml"
)
summary_config = toml.load(
Path.cwd() / "configuration/summary_configuration.toml"
PROJECT_ROOT / "configuration/summary_configuration.toml"
)
else:
configs_dir = Path(configs_dir)
config = toml.load(configs_dir / "input_configuration.toml")
emme_config = toml.load(configs_dir / "emme_configuration.toml")
network_config = toml.load(configs_dir / "network_configuration.toml")
summary_config = toml.load(
Path.cwd() / "configuration/summary_configuration.toml"
configs_dir / "summary_configuration.toml"
)

input_settings = InputSettings(**config)
emme_settings = EmmeSettings(**emme_config)
network_settings = NetworkSettings(**network_config)
summary_settings = SummarySettings(**summary_config)
model_input_dir = Path(Path.cwd() / f"inputs/model/{input_settings.abm_model}/")
model_input_dir = PROJECT_ROOT / f"inputs/model/{input_settings.abm_model}/"

return State(
input_settings=input_settings,
Expand Down
2 changes: 2 additions & 0 deletions scripts/summarize/RTP_summary/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/.quarto/
**/*.quarto_ipynb
28 changes: 14 additions & 14 deletions scripts/summarize/RTP_summary/_quarto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,23 @@ book:
repo-url: https://github.com/psrc/soundcast
search: false
sidebar:
logo: ../PSRClogo2016path.png
logo: ../notebook_styling/PSRClogo2016path.png

chapters:
- index.qmd
- summary_scripts/RTP_topsheet.ipynb
- summary_scripts/RTP_person.ipynb
- summary_scripts/RTP_household.ipynb
- summary_scripts/RTP_access.ipynb
- summary_scripts/RTP_costs.ipynb
- summary_scripts/RTP_walk_bike.ipynb
- summary_scripts/RTP_emissions.ipynb
- summary_scripts/RTP_MIC.ipynb
- summary_scripts/RTP_mode_share.ipynb
- summary_scripts/RTP_freight.ipynb
- summary_scripts/RTP_congestion.ipynb
- summary_scripts/RTP_transit.ipynb
# - summary_scripts/RTP_conformity_analysis.ipynb
- nb/RTP_topsheet.ipynb
- nb/RTP_person.ipynb
- nb/RTP_household.ipynb
- nb/RTP_access.ipynb
- nb/RTP_costs.ipynb
- nb/RTP_walk_bike.ipynb
- nb/RTP_emissions.ipynb
- nb/RTP_MIC.ipynb
- nb/RTP_mode_share.ipynb
- nb/RTP_freight.ipynb
- nb/RTP_congestion.ipynb
- nb/RTP_transit.ipynb
# - nb/RTP_conformity_analysis.ipynb


format:
Expand Down
8 changes: 4 additions & 4 deletions scripts/summarize/RTP_summary/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,20 @@ print("")

# System Summary

{{< embed summary_scripts/RTP_index.ipynb#system_summary >}}
{{< embed nb/RTP_index.ipynb#system_summary >}}

## Total VMT, VHT, Vehicle Hours Delay by County

Includes truck and external trips within bounds of the region (trips on partial links outside 4 counties are not included)

{{< embed summary_scripts/RTP_index.ipynb#total_vmt_vht_delay_by_county >}}
{{< embed nb/RTP_index.ipynb#total_vmt_vht_delay_by_county >}}

## Transit Boardings

{{< embed summary_scripts/RTP_index.ipynb#transit >}}
{{< embed nb/RTP_index.ipynb#transit >}}

## Mode Share

Resident Trips

{{< embed summary_scripts/RTP_index.ipynb#mode_share >}}
{{< embed nb/RTP_index.ipynb#mode_share >}}
Loading