"""Implement the `CompTissueProp` class."""
import logging
from .abc import CompABC
logger = logging.getLogger(__name__)
[docs]class CompTissueProp(CompABC):
"""Store information about a tissue property."""
[docs] def check(self, name, **kwargs):
"""Check if the tissue property is properly set.
Parameters
----------
name : str
The name of the property.
Raises
------
RuntimeError
If no property is set for an existing tissue.
If a field set for a tissue does not exist.
Other Parameters
----------------
tissues : dict [str, shamo.Tissue]
The tissues of the model.
"""
logger.info(f"Checking tissue property '{name}'.")
tissues = kwargs.get("tissues", {})
for t in tissues.keys():
if t not in self:
raise RuntimeError(f"No property value for tissue '{t}'.")
for t, p in self.items():
if p[1] is not None and p[1] not in tissues[t].fields:
raise RuntimeError(f"No field '{p[1]}' in tissue '{t}'.")
[docs] def to_pro_param(self, name="", **kwargs):
"""Return the parameters required to generate the PRO file.
Parameters
----------
name : str
The name of the property.
Returns
-------
list [dict [str, float|str]]
The tissue properties.
Other Parameters
----------------
tissues : dict [str, shamo.Tissue]
The tissues of the model.
Notes
-----
If a field was set for the property of a tissue, its formula is fed with all the
named parameters and evaluated to produce the expression.
"""
params = []
tissues = kwargs.get("tissues", {})
prop = {name: {t: p[0] for t, p in self.items()}}
for t, p in self.items():
if p[1] is None:
params.append({"tissue": t, "prop": p[0]})
else:
params.append(
{
"tissue": t,
"prop": tissues[t].fields[p[1]].gen_formula(**prop, **kwargs),
}
)
return params
[docs] def to_py_param(self, **kwargs):
"""Return the parameters required to generate the PY file.
Returns
-------
list [dict [str, str|float]]
The tissue properties.
Notes
-----
Each element of the list is formatted as ``{"tissue": name, "prop": value,
"field": field_name}``.
"""
return [{"tissue": t, "prop": p[0], "field": p[1]} for t, p in self.items()]
[docs] def set(self, tissue, prop, field=None):
"""Set the property for a tissue.
Parameters
----------
tissue : str
The name of the tissue.
prop : float
The value of the property.
field : str, optional
The name of the field associated.
"""
self[tissue] = [prop, field]
[docs] def sets(self, props):
"""Set multiple properties at once.
Parameters
----------
props : dict [str, float]
The properties of the tissues.
"""
for t, p in props.items():
self[t] = [p, None]