constants.py 6.21 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
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.fullname:
    def __ne__(self, other):
        return not self == other

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


class Basins(object):
    """
    Predefined basins
    """
    _known_aliases = {}
    aliases = {
        'Global_Ocean': ('glob', 'global'),

        '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',),
    }
    @classmethod
    def get_available_basins(cls, mask_regions_handler, mask_regions_3d_handler):
        """
        
        :param mask_regions_handler:
        :type mask_regions_3d_handler: netCDF4.Dataset
        :param mask_regions_3d_handler: 
        :type mask_regions_handler: netCDF4.Dataset
        """
        basin_names = set(mask_regions_handler.variables.keys() + mask_regions_3d_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(cls, basin, basin_object)
            cls._add_alias(basin, basin_object)
            try:
                for alias in cls.aliases[basin]:
                    cls._add_alias(alias, basin_object)
            except KeyError:
                pass
    @classmethod
    def _add_alias(cls, basin, basin_object):
        cls._known_aliases[basin.lower()] = basin_object
        """
        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 cls._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 """

    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 """

if __name__ == '__main__':
    Basins.get_available_basins()
    pass