# This code is inspired by the code devolped for TauREx 3.1.
# Therefore, we attach here TauREx3.1 license:
#
# BSD 3-Clause License
#
# Copyright (c) 2019, Ahmed F. Al-Refaie, Quentin Changeat, Ingo Waldmann, Giovanna Tinetti
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the names of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from abc import ABC
import numpy as np
import exosim.log as log
[docs]class Output(log.Logger):
def __init__(self):
super().__init__()
[docs] def open(self):
"""It opens the output file"""
raise NotImplementedError
[docs] def create_group(self, group_name):
"""
it creates an :class:`~exosim.output.output.OutputGroup`.
Parameters
----------
group_name: str
group name
Returns
-------
OutputGroup
"""
raise NotImplementedError
[docs] def close(self):
"""It closes the output file"""
raise NotImplementedError
def __enter__(self):
self.open()
return self
def __exit__(self, type, value, tb):
self.close()
[docs] def store_dictionary(self, dictionary, group_name=None):
"""
it stores a full dictionary inside an :class:`~exosim.output.output.OutputGroup`.
Parameters
----------
dictionary: dict
data to store
group_name: str
group name for the data
"""
from exosim.output.utils import (
recursively_save_dict_contents_to_output,
)
out = self
if group_name is not None:
out = self.create_group(group_name)
recursively_save_dict_contents_to_output(out, dictionary)
[docs] def getsize(self):
"""It returns the output file size"""
raise NotImplementedError
[docs] def delete_data(self, key):
raise NotImplementedError
[docs]class OutputGroup(Output, ABC):
def __init__(self, name):
super().__init__(name)
self._name = name
[docs] def write_array(self, array_name, array, metadata=None):
"""
Method to store :class:`~numpy.ndarray`.
Parameters
----------
array_name: str
dataset name
array: :class:`~numpy.ndarray`
data to store
metadata: dict
metadata to attach
"""
raise NotImplementedError
[docs] def write_list(self, list_name, list_array, metadata=None):
"""
Method to store lists.
Parameters
----------
list_name: str
dataset name
list_array: list
data to store
metadata: dict
metadata to attach
"""
arr = np.array(list_array)
self.write_array(list_name, arr)
[docs] def write_scalar(self, scalar_name, scalar, metadata=None):
"""
Method to store scalars.
Parameters
----------
scalar_name: str
dataset name
scalar: int or float
data to store
metadata: dict
metadata to attach
"""
raise NotImplementedError
[docs] def write_string(self, string_name, string, metadata=None, replace=False):
"""
Method to store strings.
Parameters
----------
string_name: str
dataset name
string: str
data to store
metadata: dict
metadata to attach
"""
raise NotImplementedError
[docs] def write_string_array(self, string_name, string_array, metadata=None):
"""
Method to store :class:`~numpy.ndarray` of strings.
Parameters
----------
string_name: str
dataset name
string_array: :class:`~numpy.ndarray`
data to store
metadata: dict
metadata to attach
"""
raise NotImplementedError
[docs] def write_table(self, table_name, table, metadata=None, replace=False):
"""
Method to store :class:`~astropy.table.Table` or :class:`~astropy.table.QTable`.
Parameters
----------
table_name: str
dataset name
table: :class:`~astropy.table.Table` or :class:`~astropy.table.QTable`
data to store
metadata: dict
metadata to attach
replace: bool
if ``True``, it replaces the table in the outpur file if already existing.
Default is ``False``
"""
raise NotImplementedError
[docs] def write_quantity(self, quantity_name, quantity, metadata=None):
"""
Method to store :class:`~astropy.units.Quantity`.
Parameters
----------
quantity_name: str
dataset name
quantity: :class:`~astropy.units.Quantity`
data to store
metadata: dict
metadata to attach
"""
raise NotImplementedError
[docs] def create_group(self, group_name):
"""
it creates an :class:`OutputGroup` as a subgroup
Parameters
----------
group_name: str
group name
Returns
-------
OutputGroup
"""
raise NotImplementedError
[docs] def delete_data(self, key):
"""
It deletes a specific key and its associated data from the data store.
Parameters
----------
key : str
The key identifying the data to be deleted.
Raises
------
KeyError
If the key is not found in the data store
"""
raise NotImplementedError