Source code for pycequeau.simulations.parameters.parameters
from __future__ import annotations
import json
import os
from scipy.io import savemat
from ...core import matlab_utils as matu
from ...physiographic.base import Basin
from .base import BasinParameterBase
from .hydrology import HydrologicalParameters
from .water_quality import WaterQualityParameters
[docs]
class PycequeauParams(BasinParameterBase):
"""Top-level CEQUEAU parameter facade.
This class assembles pre-built hydrology and water-quality sections into the
final CEQUEAU parameter dictionary and handles export to JSON/MAT formats.
"""
def __init__(
self,
bassinVersant: Basin,
hydrology: HydrologicalParameters | None = None,
water_quality: WaterQualityParameters | None = None,
*,
ctp: float = 0.0,
lac: float = 0.0,
surface: float = 0.0,
) -> None:
super().__init__(bassinVersant)
self.ctp = ctp
self.lac = lac
self.surface = surface
self.hydrology = hydrology or HydrologicalParameters(bassinVersant)
self.water_quality = water_quality or WaterQualityParameters(bassinVersant)
self.parametres = None
[docs]
def create_parameter_structure(self):
"""
Assemble and return the final CEQUEAU parameter dictionary.
"""
sections = {}
sections.update(self.hydrology.to_dict())
sections.update(self.water_quality.to_dict())
sections.update(
{
"ctp": self.ctp,
"lac": self.lac,
"surface": self.surface,
}
)
self.parametres = self.normalize_numeric_for_mex(sections)
return self.parametres
[docs]
def export_parameter_structure_json(self, file_name: str = "parameters.json"):
"""Export the current parameter dictionary to JSON."""
if self.parametres is None:
raise ValueError(
"Parameter structure not built yet. Call create_parameter_structure() first."
)
out_json = os.path.join(self.basin_structure.project_path, "results", file_name)
with open(out_json, "w", encoding="utf-8") as outfile:
json.dump(self.parametres, outfile, indent=4, default=tuple)
[docs]
def export_parameter_structure_mat(self, file_name: str = "parameters.mat"):
"""Export current parameter dictionary to MATLAB/Octave .mat format."""
if self.parametres is None:
raise ValueError(
"Parameter structure not built yet. Call create_parameter_structure() first."
)
out_mat = os.path.join(self.basin_structure.project_path, "results", file_name)
savemat(
out_mat,
{"parametres": matu.to_mat_compatible(self.parametres)},
long_field_names=True,
do_compression=True,
)