constants.py 6.6 KB
Newer Older
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
# coding=utf-8
"""
Contains the enumeration-like classes used by the diagnostics
"""
import netCDF4
from singleton import SingletonType
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

class Basin(object):
    """
    Class representing a given basin
    :param name: full basin's name
    :type name: str
    def __init__(self, name):
        self._name = name
        if self.name != other.name:
    def __ne__(self, other):
        return not self == other

    def __str__(self):
        return self._name
    @property
    def name(self):
        """
        Basin's full name
        :rtype: str
        """
        return self._name


class Basins(object):
    """
    Predefined basins
    """
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    __metaclass__ = SingletonType

    def __init__(self):

        self.aliases = {
            'Atlantic_Ocean': ('atl', 'atlantic'),
            'North_Atlantic_Ocean': ('natl', 'north_atlantic'),
            'Tropical_Atlantic_Ocean': ('tatl', 'tropical_atlantic'),

            'Pacific_Ocean': ('pac', 'pacific'),
            'North_Pacific_Ocean': ('npac', 'north_pacific'),
            'Tropical_Pacific_Ocean': ('tpac', 'tropical_pacific'),
            'Indo_Pacific_Ocean': ('indpac', 'indo_pacific'),

            'Indian_Ocean': ('ind', 'indian'),
            'Tropical_Indian_Ocean': ('tind', 'tropical_indian'),

            'Antarctic_Ocean': ('anta', 'antarctiv'),
            'Antarctic_Atlantic_Sector': ('antaatl', 'antarctic_atlantic'),
            'Antarctic_Indian_Sector': ('antaind', 'antarctic_indian'),

            'Arctic_Ocean': ('arct', 'arctic'),
            'Arctic_Ocean_North_Atlantic': ('arctnatl', 'artic_north_atlantic'),
            'Arctic_Marginal_Seas': ('arctmarg', 'arctic_marginal'),

            'Baffin': ('Baffin',),
            'Baffin_Bay': ('BaffBay',),
            'Baltic_Sea': ('Baltic',),
            'BarKara': ('BarKara',),
            'Barents_Sea': ('Barents',),
            'Beaufort_Chukchi_Sea': ('BeaufortChukchi',),
            'Beaufort_Sea': ('Beaufort',),
            'Bellingshausen_Sea': ('Bellingshausen',),
            'Bering': ('Bering',),
            'Bering_Strait': ('BeringStr',),
            'CanArch': ('CanArch',),
            'Canadian_Waters': ('Canadian',),
            'Caspian_Sea': ('Caspian',),
            'Central_Arctic': ('CArct',),
            'Chukchi_Sea': ('Chukchi',),
            'East_Siberian_Sea': ('ESiberian',),
            'Eastern_Central_Arctic': ('ECArct',),
            'Fram_Strait': ('Fram',),
            'Greenland_Sea': ('Greenland',),
            'Grnland': ('Grnland',),
            'Hudson': ('Hudson',),
            'Icelandic_Sea': ('Iceland',),
            'Irminger_Sea': ('Irminger',),
            'Kara_Gate_Strait': ('KaraGate',),
            'Kara_Sea': ('Kara',),
            'Labrador_Sea': ('Labrador',),
            'Laptev_East_Siberian_Chukchi_Seas': ('LaptevESiberianChukchi',),
            'Laptev_East_Siberian_Seas': ('LaptevESiberian',),
            'Laptev_Sea': ('Laptev',),
            'Lincoln_Sea': ('Lincoln',),
            'Mediterranean_Sea': ('Medit',),
            'Nares_Strait': ('Nares',),
            'Nordic_Barents_Seas': ('NordicBarents',),
            'Nordic_Seas': ('Nordic',),
            'NorthWest_Passage': ('NWPass',),
            'North_Atlantic-Arctic': ('North_Atlantic-Arctic',),
            'North_Hemisphere_Ocean': ('NHem',),
            'Norwegian_Sea': ('Norwegian',),
            'Okhotsk': ('Okhotsk',),
            'OpenOcean': ('OpenOcean',),
            'Ross_Sea': ('Ross',),
            'Serreze_Arctic': ('SerArc',),
            'Southern_Hemisphere': ('SHem',),
            'StLawr': ('StLawr',),
            'Subpolar_Gyre': ('Subpolar_Gyre',),
            'TotalArc': ('TotalArc',),
            'Vilkitsky_Strait': ('Vilkitsky_Strait',),
            'Weddell_Sea': ('Weddell_Sea',),
            'Western_Central_Arctic': ('Western_Central_Arctic',),
        }

        self.Global = Basin('Global')
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        self.Atlantic = Basin('Atlantic_Ocean')
        self.Pacific = Basin('Pacific_Ocean')
        self.IndoPacific = Basin('Indo_Pacific_Ocean')
        self.Indian = Basin('Indian_Ocean')
        self._known_aliases = {}
        self._add_alias('glob', self.Global)
        self._add_alias(self.Global.name, self.Global)

    def get_available_basins(self, handler):
        :param handler:
        :type handler: netCDF4.Dataset
        basin_names = handler.variables.keys()
        ignored_names = ('lat', 'lon', 'i', 'j', 'time', 'lev')
        for basin in basin_names:
            if basin in ignored_names:
                continue
            basin_object = Basin(basin)
            setattr(self, basin, basin_object)
            self._add_alias(basin, basin_object)
            try:
                for alias in self.aliases[basin]:
                    self._add_alias(alias, basin_object)
            except KeyError:
                pass
    def _add_alias(self, basin, basin_object):
        self._known_aliases[basin.lower()] = basin_object
    def parse(self, basin):
        """
        Return the basin matching the given name. If the parameter basin is a Basin instance, directly returns the same
        instance. This bahaviour is intended to facilitate the development of methods that can either accept a name
        or a Basin instance to characterize the basin.

        :param basin: basin name or basin instance
        :type basin: str | Basin
        :return: basin instance corresponding to the basin name
        :rtype: Basin
        """
        if isinstance(basin, Basin):
            return basin
        basin = basin.lower()
        try:
            return self._known_aliases[basin]
        except KeyError:
            return None


class Models(object):
    """
    Predefined models
    """

    ECEARTH_2_3_O1L42 = 'Ec2.3_O1L42'
    """ EC-Earth 2.3 ORCA1 L42"""
    ECEARTH_3_0_O1L46 = 'Ec3.0_O1L46'
    """ EC-Earth 3 ORCA1 L46 """
    ECEARTH_3_0_O25L46 = 'Ec3.0_O25L46'
    """ EC-Earth 3 ORCA0.25 L46 """
    ECEARTH_3_0_O25L75 = 'Ec3.0_O25L75'
    """ EC-Earth 3 ORCA0.25 L75 """
    ECEARTH_3_1_O25L75 = 'Ec3.1_O25L75'
    """ EC-Earth 3.1 ORCA0.25 L75 """
    ECEARTH_3_2_O1L75 = 'Ec3.2_O1L75'
    """ EC-Earth 3.2 ORCA1 L75 """
    ECEARTH_3_2_O25L75 = 'Ec3.2_O25L75'
    """ EC-Earth 3.2 ORCA0.25 L75 """

    NEMO_3_2_O1L42 = 'N3.2_O1L42'
    """ NEMO 3.2 ORCA1 L42 """
    NEMO_3_3_O1L46 = 'N3.3_O1L46'
    """ NEMO 3.3 ORCA1 L46 """
    NEMO_3_6_O1L46 = 'N3.6_O1L75'
    """ NEMO 3.6 ORCA1 L75 """

    NEMOVAR_O1L42 = 'nemovar_O1L42'
    """ NEMOVAR ORCA1 L42 """
    GLORYS2_V1_O25L75 = 'glorys2v1_O25L75'
    """ GLORYS2v1 ORCA0.25 L75 """