Source code for exosim.tasks.load.loadOpticalElementHDF5
import h5py
import numpy as np
from exosim.models import signal as signal
from exosim.tasks.load.loadOpticalElement import LoadOpticalElement
from exosim.utils import checks as checks
[docs]class LoadOpticalElementHDF5(LoadOpticalElement):
"""
Class to load an optical element and return its radiance and efficiency using data from an HDF5 file.
This class inherits from LoadOpticalElement and overrides the `model` and `_get_data` methods to use an HDF5 file
for the optical element data.
Returns
--------
:class:`~exosim.models.signal.Radiance`
optical element radiance
:class:`~exosim.models.signal.Dimensionless`
optical element efficiency
"""
def __init__(self):
super().__init__()
self.set_log_name() # Ensure that the logger is properly initialized
def _get_data(self, parameters, wl, tt, key, signal_type):
"""
Load wavelength-dependent data from an HDF5 file, handling multiple structures.
Parameters
----------
parameters: dict
dictionary containing the sources parameters.
wl: :class:`~astropy.units.Quantity`
wavelength grid.
tt: :class:`~astropy.units.Quantity`
time grid.
key: str
the key to read the specific dataset in the HDF5 group.
signal_type: :class:`~exosim.models.signal.Signal`
type of the signal to create.
Returns
-------
:class:`~exosim.models.signal.Signal`
extracted data as the specified signal type
"""
hdf5_file_path = parameters["hdf5_file"]
group_key = parameters["group_key"]
read_key = parameters[key]
with h5py.File(hdf5_file_path, "r") as hdf5_file:
# Check if the group exists
if group_key not in hdf5_file:
raise KeyError(
f"Group '{group_key}' not found in HDF5 file '{hdf5_file_path}'"
)
group = hdf5_file[group_key]
# Handle two possible structures
if read_key in group and isinstance(group[read_key], h5py.Dataset):
self.debug(
f"Reading data from dataset '{read_key}' in group '{group_key}'"
)
# Default structure: read_key and wavelength_key directly in group
parsed_wl = checks.check_units(
group[parameters["wavelength_key"]][:], "um", force=True
)
parsed_data = group[read_key][:]
elif read_key in group.keys() and isinstance(
group[read_key], h5py.Group
):
self.debug(
f"Reading data from folder '{read_key}' in group '{group_key}'"
)
# Alternative structure: read_key as a folder containing datasets
subgroup = group[read_key]
if (
parameters["wavelength_key"] not in subgroup
or read_key not in subgroup
):
raise KeyError(
f"Datasets '{parameters['wavelength_key']}' and '{read_key}' "
f"not found in folder '{read_key}' within group '{group_key}'"
)
parsed_wl = checks.check_units(
subgroup[parameters["wavelength_key"]][:], "um", force=True
)
parsed_data = subgroup[read_key][:]
else:
raise KeyError(
f"Dataset or folder '{read_key}' not found in group '{group_key}'"
)
# Create and process the signal
extracted_data = signal_type(spectral=parsed_wl, data=parsed_data)
extracted_data.spectral_rebin(wl)
extracted_data.temporal_rebin(tt)
self.debug(
f"Extracted data for key '{read_key}': {extracted_data.data}"
)
return extracted_data