from taurex.log import Logger
from taurex.data.fittable import Fittable
from taurex.output.writeable import Writeable
from taurex.core import Citable
[docs]class ForwardModel(Logger, Fittable, Writeable, Citable):
"""A base class for producing forward models"""
def __init__(self, name):
Logger.__init__(self, name)
Fittable.__init__(self)
self.opacity_dict = {}
self.cia_dict = {}
self._native_grid = None
self._derived_parameters = self.derived_parameters()
self._fitting_parameters = self.fitting_parameters()
self.contribution_list = []
def __getitem__(self, key):
return self._fitting_parameters[key][2]()
def __setitem__(self, key, value):
return self._fitting_parameters[key][3](value)
[docs] def defaultBinner(self):
from taurex.binning import NativeBinner
return NativeBinner()
[docs] def add_contribution(self, contrib):
from taurex.contributions import Contribution
if not isinstance(contrib, Contribution):
raise TypeError('Is not a a contribution type')
else:
if not contrib in self.contribution_list:
self.contribution_list.append(contrib)
else:
raise Exception('Contribution already exists')
[docs] def build(self):
raise NotImplementedError
[docs] def model(self, wngrid=None, cutoff_grid=True):
"""Computes the forward model for a wngrid"""
raise NotImplementedError
[docs] def model_full_contrib(self, wngrid=None, cutoff_grid=True):
"""Computes the forward model for a wngrid for each contribution"""
raise NotImplementedError
@property
def fittingParameters(self):
return self._fitting_parameters
@property
def derivedParameters(self):
return self._derived_parameters
[docs] def compute_error(self, samples, wngrid=None, binner=None):
return {}, {}
[docs] def write(self, output):
model = output.create_group('ModelParameters')
model.write_string('model_type', self.__class__.__name__)
contrib = model.create_group('Contributions')
for c in self.contribution_list:
c.write(contrib)
return model
[docs] def generate_profiles(self):
"""
Must return a dictionary of profiles you want to
store after modeling
"""
from taurex.util.output import generate_profile_dict
if hasattr(self, 'temperatureProfile'):
return generate_profile_dict(self) # To ensure this change does not break anything
else:
return {}
[docs] def citations(self):
from taurex.core import unique_citations_only
model_citations = super().citations()
for c in self.contribution_list:
model_citations.extend(c.citations())
return unique_citations_only(model_citations)