Source code for parts.dimensions

""" Dimensions

The Dimensions class keeps track of the different dimensions in
an ARTS atmosphere. The purpose of this class is to allow the inferral
of dimensions from the provided data, but at the same time to be able
to identify inconsistencies.

Attributes:

    p(Dimension): Dimension object representing the size of the
        ARTS pressure grid
    lat(Dimension) Dimension object representing the size of the
        latitude grid
    lon(Dimension) Dimension object representing the size of the
        longitude grid
    joker(Joker) Dimension object representing a dimensions that
        can take an arbitrary value.

"""

[docs]class Dimension: """ Dimensions of data arrays in ARTS. The required dimensions of most array data used in an ARTS simulation are fixed by the dimensions of the atmosphere. The Dimension class provides a symbolic representation of these dimensions in an ARTS simulation, so that these can be inferred and checked for consistency. Dimension objects are used to define the dimensions of ARTS data and keep track of the different values inferred from user-provided data. """ def __init__(self, name): """ Create dimension with given name. Parameters: name(str): The name of the dimension, e.g. "Pressure grid" """ self.name = name self.deductions = {}
[docs] def add_deduction(self, ws, value, who): """ If a value of a dimension becomes apparent from data it should be signaled to the :code:`Dimension` object. The dimension object keeps track of these "deductions" for each workspace separately. Parameters: ws(typhon.arts.workspace.Workspace): Workspace object for which the dimension was deduced. value(Int): The deduced dimenions who(str): The name of the variable from which this value was deduced. """ if not ws in self.deductions: self.deductions[ws] = [(value, who)] else: self.deductions[ws] += [(value, who)]
[docs] def check(self, ws, n, who): """ Check given value for consistency. Parameters: ws(typhon.arts.workspace.Workspace): The workspace for which to check the deduction. n(int): The value which to check against previous deduced values. Returns: True if this is the first deduction or is previous deuctions agree with the current value. False otherwise. """ if not ws in self.deductions: self.deductions[ws] = (n, who) return True else: (m, who) = self.deductions[ws] return m == n
[docs] def get_value(self, ws): """ Get the deduced value of the dimension. Parameters: ws(typhon.arts.workspace.Workspace) The workspace object for which the value of the dimension should be deduced. Raises: Exception: If no or inconsistent values have been deduced. """ self.check(ws) ds = self.deductions[ws] if len(ds) > 0: return ds[0][0] else: raise Exception("No value for dimension of the {0} has been " "deduced.")
[docs]class Joker(Dimension): """ A dimension that can take an arbitrary value. """ def __init__(self, name): """ Create dimension with given name. Parameters: name(str): The name of the dimension, e.g. "Pressure grid" """ self.name = name self.deductions = {}
[docs] def add_deduction(self, ws, value, who): """ This function does nothing. """ pass
[docs] def check(self, *args, **kwargs): """ This function does nothing. """ pass
[docs] def get_value(self, *args, **kwargs): """ Raises an exception because it doesn't make sense to try an get a value from a joker dimension. Raises: Exception: If no or inconsistent values have been deduced. """ raise Exception("Can't get the value of a joker dimension.")
p = Dimension("pressure grid") lat = Dimension("latitude grid") lon = Dimension("longitude grid") atm = Dimension("atmospheric dimension") los = Dimension("line of sight dimension") joker = Joker("This dimension can take any value.")