Source code for watts.plugin_accert

# SPDX-FileCopyrightText: 2022-2023 UChicago Argonne, LLC
# SPDX-License-Identifier: MIT

from pathlib import Path
import sys
from typing import List, Optional

import pandas as pd

from .fileutils import PathLike
from .plugin import PluginGeneric, _find_executable
from .results import Results


[docs] class PluginACCERT(PluginGeneric): """Plugin for running ACCERT Parameters ---------- template_file Templated ACCERT input executable Path to ACCERT Main.py script extra_inputs List of extra (non-templated) input files that are needed extra_template_inputs Extra templated input files show_stdout Whether to display output from stdout when ACCERT is run show_stderr Whether to display output from stderr when ACCERT is run Attributes ---------- executable Path to ACCERT executable """ def __init__(self, template_file: str, executable: PathLike = 'Main.py', extra_inputs: Optional[List[str]] = None, extra_template_inputs: Optional[List[PathLike]] = None, show_stdout: bool = False, show_stderr: bool = False): executable = _find_executable(executable, 'ACCERT_DIR') execute_command = [sys.executable, '{self.executable}', '-i', '{self.input_name}'] super().__init__(executable, execute_command, template_file, extra_inputs, extra_template_inputs, "ACCERT", show_stdout, show_stderr) self.input_name = "ACCERT_input.son" @PluginGeneric.executable.setter def executable(self, exe: PathLike): if not exe.is_file(): raise RuntimeError( f"{self.plugin_name} module '{exe}' does not exist. The " "ACCERT_DIR environment variable needs to be set to a directory " "containing the Main.py module." ) self._executable = Path(exe)
class ResultsACCERT(Results): """ACCERT simulation results Parameters ---------- params Parameters used to generate inputs exec_info Execution information (job ID, plugin name, time, etc.) inputs List of input files outputs List of output files Attributes ---------- total_cost ACCERT results of total cost account_table ACCERT results of account table """ @property def total_cost(self) -> float: return self.account_table['total_cost'].values[0] @property def account_table(self) -> pd.DataFrame: account_file = self.base_path / 'ACCERT_updated_account.xlsx' if Path(account_file).exists(): return pd.read_excel(account_file) else: raise FileNotFoundError('ACCERT output file not found')