grib2io.tables

Functions for retreiving data from NCEP GRIB2 Tables.

  1"""
  2Functions for retreiving data from NCEP GRIB2 Tables.
  3"""
  4
  5from .section0 import *
  6from .section1 import *
  7from .section3 import *
  8from .section4 import *
  9from .section5 import *
 10from .section6 import *
 11from .originating_centers import *
 12
 13
 14def get_table(table, expand=False):
 15    """
 16    Return GRIB2 code table as a dictionary.
 17
 18    Parameters
 19    ----------
 20
 21    **`table`**: Code table number (e.g. '1.0'). NOTE: Code table '4.1' requires a 3rd value
 22    representing the product discipline (e.g. '4.1.0').
 23
 24    **`expand`**: If `True`, expand output dictionary where keys are a range.
 25
 26    Returns
 27    -------
 28
 29    **`dict`**
 30    """
 31    if len(table) == 3 and table == '4.1':
 32        raise Exception('GRIB2 Code Table 4.1 requires a 3rd value representing the discipline.')
 33    if len(table) == 3 and table.startswith('4.2'):
 34        raise Exception('Use function get_varinfo_from_table() for GRIB2 Code Table 4.2')
 35    try:
 36        tbl = globals()['table_'+table.replace('.','_')]
 37        if expand:
 38            _tbl = {}
 39            for k,v in tbl.items():
 40                if '-' in k:
 41                    irng = [int(i) for i in k.split('-')]
 42                    for i in range(irng[0],irng[1]+1):
 43                        _tbl[str(i)] = v
 44                else:
 45                    _tbl[k] = v
 46            tbl = _tbl
 47        return tbl
 48    except(KeyError):
 49        return {}
 50
 51
 52def get_value_from_table(value, table, expand=False):
 53    """
 54    Return the definition given a GRIB2 code table.
 55
 56    Parameters
 57    ----------
 58
 59    **`value`**: `int` or `str` code table value.
 60
 61    **`table`**: `str` code table number.
 62
 63    **`expand`**: If `True`, expand output dictionary where keys are a range.
 64    Returns
 65    -------
 66
 67    Table value or `None` if not found.
 68    """
 69    try:
 70        tbl = get_table(table,expand=expand)
 71        value = str(value)
 72        return tbl[value]
 73    except(KeyError):
 74        for k in tbl.keys():
 75            if '-' in k:
 76                bounds = k.split('-')
 77                if value >= bounds[0] and value <= bounds[1]:
 78                    return tbl[k]
 79        return None
 80
 81
 82def get_varinfo_from_table(discipline,parmcat,parmnum,isNDFD=False):
 83    """
 84    Return the GRIB2 variable information given values of `discipline`,
 85    `parmcat`, and `parmnum`. NOTE: This functions allows for all arguments
 86    to be converted to a string type if arguments are integer.
 87
 88    Parameters
 89    ----------
 90
 91    **`discipline`**: `int` or `str` of Discipline code value of a GRIB2 message.
 92
 93    **`parmcat`**: `int` or `str` of Parameter Category value of a GRIB2 message.
 94
 95    **`parmnum`**: `int` or `str` of Parameter Number value of a GRIB2 message.
 96
 97    **`isNDFD`**: If `True`, signals function to try to get variable information
 98    from the supplemental NDFD tables.
 99
100    Returns
101    -------
102
103    **`list`**: containing variable information. "Unknown" is given for item of
104    information if variable is not found.
105    - list[0] = full name
106    - list[1] = units
107    - list[2] = short name (abbreviated name)
108    """
109    if isNDFD:
110        try:
111            tblname = f'table_4_2_{discipline}_{parmcat}_ndfd'
112            modname = f'.section4_discipline{discipline}'
113            exec('from '+modname+' import *')
114            return locals()[tblname][str(parmnum)]
115        except(ImportError,KeyError):
116            pass
117            #return ['Unknown','Unknown','Unknown']
118    try:
119        tblname = f'table_4_2_{discipline}_{parmcat}'
120        modname = f'.section4_discipline{discipline}'
121        exec('from '+modname+' import *')
122        return locals()[tblname][str(parmnum)]
123    except(ImportError,KeyError):
124        return ['Unknown','Unknown','Unknown']
125
126
127def get_wgrib2_level_string(pdtn,pdt):
128    """
129    Return a string that describes the level or layer of the GRIB2 message. The
130    format and language of the string is an exact replica of how wgrib2 produces
131    the level/layer string in its inventory output.
132
133    Contents of wgrib2 source, [Level.c](https://github.com/NOAA-EMC/NCEPLIBS-wgrib2/blob/develop/wgrib2/Level.c),
134    were converted into a Python dictionary and stored in grib2io as table
135    'wgrib2_level_string'.
136
137    Parameters
138    ----------
139
140    **`pdtn`**: GRIB2 Product Definition Template Number
141
142    **`pdt`**: sequence containing GRIB2 Product Definition Template (Section 4).
143
144    Returns
145    -------
146
147    **`str`**: wgrib2-formatted level/layer string.
148    """
149    if pdtn == 48:
150        idxs = slice(20,26)
151    else:
152        idxs = slice(9,15)
153    type1, sfac1, sval1, type2, sfac2, sval2 = map(int,pdt[idxs])
154    lvlstr = ''
155    val1 = sval1/10**sfac1
156    if type1 in [100,108]: val1 *= 0.01
157    if type2 != 255:
158        # Layer
159        #assert type2 == type1, "Surface types are not equal: %g - %g" % (type1,type2)
160        val2 = sval2/10**sfac2
161        if type2 in [100,108]: val2 *= 0.01
162        lvlstr = get_value_from_table(type1,table='wgrib2_level_string')[1]
163        vals = (val1,val2)
164    else:
165        # Level
166        lvlstr = get_value_from_table(type1,table='wgrib2_level_string')[0]
167        vals = (val1)
168    if '%g' in lvlstr: lvlstr %= vals
169    return lvlstr
def get_table(table, expand=False):
15def get_table(table, expand=False):
16    """
17    Return GRIB2 code table as a dictionary.
18
19    Parameters
20    ----------
21
22    **`table`**: Code table number (e.g. '1.0'). NOTE: Code table '4.1' requires a 3rd value
23    representing the product discipline (e.g. '4.1.0').
24
25    **`expand`**: If `True`, expand output dictionary where keys are a range.
26
27    Returns
28    -------
29
30    **`dict`**
31    """
32    if len(table) == 3 and table == '4.1':
33        raise Exception('GRIB2 Code Table 4.1 requires a 3rd value representing the discipline.')
34    if len(table) == 3 and table.startswith('4.2'):
35        raise Exception('Use function get_varinfo_from_table() for GRIB2 Code Table 4.2')
36    try:
37        tbl = globals()['table_'+table.replace('.','_')]
38        if expand:
39            _tbl = {}
40            for k,v in tbl.items():
41                if '-' in k:
42                    irng = [int(i) for i in k.split('-')]
43                    for i in range(irng[0],irng[1]+1):
44                        _tbl[str(i)] = v
45                else:
46                    _tbl[k] = v
47            tbl = _tbl
48        return tbl
49    except(KeyError):
50        return {}

Return GRIB2 code table as a dictionary.

Parameters

table: Code table number (e.g. '1.0'). NOTE: Code table '4.1' requires a 3rd value representing the product discipline (e.g. '4.1.0').

expand: If True, expand output dictionary where keys are a range.

Returns

dict

def get_value_from_table(value, table, expand=False):
53def get_value_from_table(value, table, expand=False):
54    """
55    Return the definition given a GRIB2 code table.
56
57    Parameters
58    ----------
59
60    **`value`**: `int` or `str` code table value.
61
62    **`table`**: `str` code table number.
63
64    **`expand`**: If `True`, expand output dictionary where keys are a range.
65    Returns
66    -------
67
68    Table value or `None` if not found.
69    """
70    try:
71        tbl = get_table(table,expand=expand)
72        value = str(value)
73        return tbl[value]
74    except(KeyError):
75        for k in tbl.keys():
76            if '-' in k:
77                bounds = k.split('-')
78                if value >= bounds[0] and value <= bounds[1]:
79                    return tbl[k]
80        return None

Return the definition given a GRIB2 code table.

Parameters

value: int or str code table value.

table: str code table number.

expand: If True, expand output dictionary where keys are a range.

Returns

Table value or None if not found.

def get_varinfo_from_table(discipline, parmcat, parmnum, isNDFD=False):
 83def get_varinfo_from_table(discipline,parmcat,parmnum,isNDFD=False):
 84    """
 85    Return the GRIB2 variable information given values of `discipline`,
 86    `parmcat`, and `parmnum`. NOTE: This functions allows for all arguments
 87    to be converted to a string type if arguments are integer.
 88
 89    Parameters
 90    ----------
 91
 92    **`discipline`**: `int` or `str` of Discipline code value of a GRIB2 message.
 93
 94    **`parmcat`**: `int` or `str` of Parameter Category value of a GRIB2 message.
 95
 96    **`parmnum`**: `int` or `str` of Parameter Number value of a GRIB2 message.
 97
 98    **`isNDFD`**: If `True`, signals function to try to get variable information
 99    from the supplemental NDFD tables.
100
101    Returns
102    -------
103
104    **`list`**: containing variable information. "Unknown" is given for item of
105    information if variable is not found.
106    - list[0] = full name
107    - list[1] = units
108    - list[2] = short name (abbreviated name)
109    """
110    if isNDFD:
111        try:
112            tblname = f'table_4_2_{discipline}_{parmcat}_ndfd'
113            modname = f'.section4_discipline{discipline}'
114            exec('from '+modname+' import *')
115            return locals()[tblname][str(parmnum)]
116        except(ImportError,KeyError):
117            pass
118            #return ['Unknown','Unknown','Unknown']
119    try:
120        tblname = f'table_4_2_{discipline}_{parmcat}'
121        modname = f'.section4_discipline{discipline}'
122        exec('from '+modname+' import *')
123        return locals()[tblname][str(parmnum)]
124    except(ImportError,KeyError):
125        return ['Unknown','Unknown','Unknown']

Return the GRIB2 variable information given values of discipline, parmcat, and parmnum. NOTE: This functions allows for all arguments to be converted to a string type if arguments are integer.

Parameters

discipline: int or str of Discipline code value of a GRIB2 message.

parmcat: int or str of Parameter Category value of a GRIB2 message.

parmnum: int or str of Parameter Number value of a GRIB2 message.

isNDFD: If True, signals function to try to get variable information from the supplemental NDFD tables.

Returns

list: containing variable information. "Unknown" is given for item of information if variable is not found.

  • list[0] = full name
  • list[1] = units
  • list[2] = short name (abbreviated name)
def get_wgrib2_level_string(pdtn, pdt):
128def get_wgrib2_level_string(pdtn,pdt):
129    """
130    Return a string that describes the level or layer of the GRIB2 message. The
131    format and language of the string is an exact replica of how wgrib2 produces
132    the level/layer string in its inventory output.
133
134    Contents of wgrib2 source, [Level.c](https://github.com/NOAA-EMC/NCEPLIBS-wgrib2/blob/develop/wgrib2/Level.c),
135    were converted into a Python dictionary and stored in grib2io as table
136    'wgrib2_level_string'.
137
138    Parameters
139    ----------
140
141    **`pdtn`**: GRIB2 Product Definition Template Number
142
143    **`pdt`**: sequence containing GRIB2 Product Definition Template (Section 4).
144
145    Returns
146    -------
147
148    **`str`**: wgrib2-formatted level/layer string.
149    """
150    if pdtn == 48:
151        idxs = slice(20,26)
152    else:
153        idxs = slice(9,15)
154    type1, sfac1, sval1, type2, sfac2, sval2 = map(int,pdt[idxs])
155    lvlstr = ''
156    val1 = sval1/10**sfac1
157    if type1 in [100,108]: val1 *= 0.01
158    if type2 != 255:
159        # Layer
160        #assert type2 == type1, "Surface types are not equal: %g - %g" % (type1,type2)
161        val2 = sval2/10**sfac2
162        if type2 in [100,108]: val2 *= 0.01
163        lvlstr = get_value_from_table(type1,table='wgrib2_level_string')[1]
164        vals = (val1,val2)
165    else:
166        # Level
167        lvlstr = get_value_from_table(type1,table='wgrib2_level_string')[0]
168        vals = (val1)
169    if '%g' in lvlstr: lvlstr %= vals
170    return lvlstr

Return a string that describes the level or layer of the GRIB2 message. The format and language of the string is an exact replica of how wgrib2 produces the level/layer string in its inventory output.

Contents of wgrib2 source, Level.c, were converted into a Python dictionary and stored in grib2io as table 'wgrib2_level_string'.

Parameters

pdtn: GRIB2 Product Definition Template Number

pdt: sequence containing GRIB2 Product Definition Template (Section 4).

Returns

str: wgrib2-formatted level/layer string.