Source code for pyRadPlan.scenarios
"""Scenario Models for uncertainty quantification, robust optimization and robustness analysis."""
from typing import Union, Optional, Type
from pyRadPlan.ct import CT, validate_ct
from ._base import ScenarioModel
from ._nominal import NominalScenario
import logging
from copy import deepcopy
logger = logging.getLogger(__name__)
[docs]
def available_scenario_models() -> list[str]:
"""Return a list of available scenario models."""
return ["nomScen"]
[docs]
def create_scenario_model(
model_def: Union[ScenarioModel, Union[str, dict]] = "nomScen",
ct: Optional[Union[CT, dict]] = None,
) -> ScenarioModel:
"""
Return a scenario model object.
Parameters
----------
model_name : str
The name of the scenario model.
Returns
-------
ScenarioModel
The scenario model object.
"""
if isinstance(ct, dict):
ct = validate_ct(ct)
if isinstance(model_def, str):
model_class = _get_model_class_by_name(model_def)
return model_class(ct)
if isinstance(model_def, ScenarioModel):
return model_def
if isinstance(model_def, dict):
model_name = model_def.pop("model", None)
if model_name is None:
raise ValueError("Scenario model name not provided in the model definition")
model_class = _get_model_class_by_name(model_name)
return model_class(ct, **model_def)
raise ValueError("Invalid scenario model definition")
def _get_model_class_by_name(model_name: str) -> Type[ScenarioModel]:
"""Return the scenario model class by name."""
if model_name == "nomScen":
return NominalScenario
if model_name == "wcScen":
raise NotImplementedError("Worst Case Scenarios are not implemented yet")
if model_name == "impScen":
raise NotImplementedError("Gridded Importance Weighted Scenarios are not implemented yet")
if model_name == "rndScen":
raise NotImplementedError("Random Scenarios are not implemented yet")
raise ValueError(f"Unknown scenario model: {model_name}")
[docs]
def validate_scenario_model(
model_def: Union[ScenarioModel, Union[str, dict]], ct: Union[CT, dict] = None
) -> ScenarioModel:
"""
Validate a scenario model input and returns a scenario model object.
Parameters
----------
model_def : Union[ScenarioModel, Union[str, dict]]
The scenario model object.
Returns
-------
ScenarioModel
The scenario model object.
"""
model_def = deepcopy(model_def)
if "ctScenProb" in model_def:
if all(a > 0 for a, b in model_def["ctScenProb"]):
model_def["ctScenProb"] = [(a - 1, b) for (a, b) in model_def["ctScenProb"]]
logger.info(
"Assuming scenario model from matRad. Converting 1-based indexing to 0-based "
"indexing..."
)
else:
logger.info(
"CamelCase was used, but assuming 0-based indexing, since some values are less "
"than 1. No index conversion applied"
)
return create_scenario_model(model_def, ct)
__all__ = ["ScenarioModel", "NominalScenario", "create_scenario_model"]