Source code for exosim.output.utils
import astropy.units as u
import numpy as np
from astropy.table import QTable, Table
import exosim.models.signal as signal
[docs]
def recursively_save_dict_contents_to_output(output, dic):
"""
Will recursive write a dictionary into output.
Parameters
----------
:class:`~exosim.output.output.Output` :
Group (or root) in output file to write to
dic : :obj:`dict`
Dictionary we want to write
"""
for key, item in dic.items():
try:
store_thing(output, key, item)
except TypeError:
raise ValueError(f"Cannot write {type(item)} type") from None
return
[docs]
def store_thing(output, key, item):
"""
It stores one thing into the :class:`~exosim.output.output.Output`
Parameters
----------
:class:`~exosim.output.output.Output`:
Group (or root) in output file to write to
key: str
name for the stored item
item: obj
item to store
"""
if isinstance(item, u.Quantity):
output.write_quantity(key, item)
elif isinstance(item, float | int | np.int64 | np.float64):
output.write_scalar(key, item)
elif isinstance(item, np.ndarray):
if True in [isinstance(x, str) for x in item]:
output.write_string_array(key, item)
else:
output.write_array(key, item)
elif isinstance(item, str):
output.write_string(key, item)
elif isinstance(item, Table | QTable):
output.write_table(key, item)
elif isinstance(item, signal.Signal):
item.write(output, key)
# group = output.create_group(key)
# recursively_save_dict_contents_to_output(group, item.to_dict())
elif isinstance(item, list | tuple):
if isinstance(item, tuple):
item = list(item)
if True in [isinstance(x, str) for x in item]:
output.write_string_array(key, np.array(item))
else:
try:
output.write_array(key, np.array(item))
except (TypeError, ValueError):
for idx, val in enumerate(item):
new_key = f"{key}{idx}"
store_thing(output, new_key, val)
elif isinstance(item, dict):
group = output.create_group(key)
recursively_save_dict_contents_to_output(group, item)
elif item is None:
pass
else:
raise TypeError
return