Skip to content

Bug in thermal impacts for CTA: geometries do not match #49

@dan-mccabe

Description

@dan-mccabe

Steps to Reproduce

if __name__ == "__main__":
    import logging
    import os
    import time
    import warnings
    from pathlib import Path

    from nrel.routee.transit import GTFSEnergyPredictor

    # Suppress GDAL/PROJ warnings
    os.environ["PROJ_DEBUG"] = "0"
    # Suppress pandas FutureWarning from RouteE-Powertrain
    warnings.filterwarnings("ignore", category=FutureWarning, message=".*swapaxes.*")

    # Configure logging
    logging.getLogger().handlers.clear()
    logging.basicConfig(
        level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s - %(message)s"
    )
    logger = logging.getLogger("single_agency_analysis")

    HERE = Path(__file__).parent.resolve()

    # Configuration
    n_proc = 8
    routee_vehicle_models = [
        "Transit_Bus_Battery_Electric",
        "Transit_Bus_Diesel",
    ]
    input_directory = HERE / "../sample-inputs/chicago/gtfs"
    output_directory = HERE / "../reports/chicago"

    start_time = time.time()

    predictor = GTFSEnergyPredictor(
        gtfs_path=input_directory,
        n_processes=n_proc,
    )

    # Run entire pipeline with one method call
    results = predictor.run(
        vehicle_models=routee_vehicle_models,
        date="2025/12/03",
        routes=["20"],
        add_mid_block_deadhead=True,
        add_depot_deadhead=True,
        add_grade=True,
        add_hvac=True,
        output_dir=output_directory,
        save_results=True,
    )
    print(results.head())

    logger.info(f"Predicted energy for {len(results)} trips")

Output:

2026-01-06 15:51:24,075 [INFO] nrel.routee.transit.predictor - Initialized GTFSEnergyPredictor for /Users/dmccabe/repos/public/routee-transit/scripts/../sample-inputs/chicago/gtfs
2026-01-06 15:51:24,075 [INFO] nrel.routee.transit.predictor - Loading GTFS data...
2026-01-06 15:51:31,500 [INFO] nrel.routee.transit.predictor - Feed includes 1 agencies: ['Chicago Transit Authority']. Total trips: 89536, shapes: 1570
2026-01-06 15:51:31,557 [INFO] nrel.routee.transit.predictor - Loaded 89536 trips and 1544 shapes
2026-01-06 15:51:31,557 [INFO] nrel.routee.transit.predictor - Filtering trips (date=2025/12/03, routes=['20'])...
2026-01-06 15:51:31,668 [INFO] nrel.routee.transit.predictor - Filtered to 359 trips and 13 shapes
2026-01-06 15:51:31,668 [INFO] nrel.routee.transit.predictor - Adding between-trip deadhead trips...
2026-01-06 15:51:35,953 [INFO] nrel.routee.transit.predictor - Added 63 between-trip deadhead trips
2026-01-06 15:51:35,960 [INFO] nrel.routee.transit.predictor - Adding depot deadhead trips...
2026-01-06 15:51:45,427 [INFO] nrel.routee.transit.predictor - Added 76 depot deadhead trips
2026-01-06 15:51:45,446 [INFO] nrel.routee.transit.predictor - Matching shapes to road network...
2026-01-06 15:52:05,802 [INFO] nrel.routee.transit.predictor - Finished map matching
2026-01-06 15:52:10,739 [INFO] gtfs_processing - Finished attaching timestamps
2026-01-06 15:52:10,929 [INFO] nrel.routee.transit.predictor - Adding road grade information...
2026-01-06 15:52:10,935 [INFO] /Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/grade/add_grade.py - Running gradeit on 438 trips with 8 processes.
2026-01-06 15:52:11,548 [INFO] nrel.routee.transit.grade.download - Downloading 1 USGS tiles at ONE_THIRD_ARC_SECOND resolution.
2026-01-06 15:52:11,548 [INFO] nrel.routee.transit.grade.download - cache/n42w088/USGS_13_n42w088.tif already exists, skipping
2026-01-06 15:54:13,091 [INFO] nrel.routee.transit.predictor - Generated 34857 link-level features for RouteE
2026-01-06 15:54:13,094 [INFO] nrel.routee.transit.predictor - Predicting energy for 2 vehicle model(s)...
2026-01-06 15:54:13,094 [INFO] nrel.routee.transit.predictor - Processing model: Transit_Bus_Battery_Electric
2026-01-06 15:54:27,411 [INFO] nrel.routee.transit.predictor - Adding HVAC energy impacts...
Failed to download nan.csv: An error occurred (404) when calling the HeadObject operation: Not Found
Traceback (most recent call last):
  File "/Users/dmccabe/repos/public/routee-transit/scripts/single_agency_full_analysis.py", line 58, in <module>
    results = predictor.run(
              ^^^^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/predictor.py", line 243, in run
    self.predict_energy(vehicle_models=vehicle_models, add_hvac=add_hvac)
  File "/Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/predictor.py", line 691, in predict_energy
    hvac_energy = add_HVAC_energy(self.feed, self.trips)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/nrel/routee/transit/thermal_energy.py", line 129, in add_HVAC_energy
    df_temp = pd.read_csv(local_file, parse_dates=["date_time"])
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1026, in read_csv
    return _read(filepath_or_buffer, kwds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 620, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1620, in __init__
    self._engine = self._make_engine(f, self.engine)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1880, in _make_engine
    self.handles = get_handle(
                   ^^^^^^^^^^^
  File "/Users/dmccabe/repos/public/routee-transit/.pixi/envs/dev-py311/lib/python3.11/site-packages/pandas/io/common.py", line 873, in get_handle
    handle = open(
             ^^^^^
FileNotFoundError: [Errno 2] No such file or directory: './TMY/nan.csv'

There is evidently an issue in how the GTFS data is matched to the TMY files in this case, where a location gets mapped to NaN and the code then expects a nan.csv file to exist instead of failing more sensibly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions