GridDataRetriever   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 17
eloc 93
dl 0
loc 129
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A GridDataRetriever.__init__() 0 14 1
D GridDataRetriever.getData() 0 64 12

3 Functions

Rating   Name   Duplication   Size   Complexity  
A getgriddata() 0 5 1
A replacemissing() 0 4 2
A getheader() 0 6 1
1
import os
2
import numpy
3
from datetime import datetime
4
from awips import ThriftClient
5
from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import GetGridDataRequest
6
7
8
class GridDataRetriever:
9
10
    def __init__(self, server, pluginName, modelId, cycle, forecast, level1, level2, vcoord, param, nnx, nny):
11
        self.pluginName = pluginName
12
        self.modelId = modelId
13
        self.cycle = cycle
14
        self.forecast = forecast
15
        self.level1 = level1
16
        self.level2 = level2
17
        self.vcoord = vcoord
18
        self.param = param
19
        self.nx = nnx
20
        self.ny = nny
21
        self.host = os.getenv("DEFAULT_HOST", server)
22
        self.port = os.getenv("DEFAULT_PORT", "9581")
23
        self.client = ThriftClient.ThriftClient(self.host, self.port)
24
25
    def getData(self):
26
        """ Sends ThriftClient request and writes out received files."""
27
        req = GetGridDataRequest()
28
29
        req.setPluginName(self.pluginName)
30
        req.setModelId(self.modelId)
31
32
        dt = datetime.strptime(self.cycle, '%y%m%d/%H%M')
33
        ct = datetime.strftime(dt, '%Y-%m-%d %H:%M:%S')
34
        req.setReftime(ct)
35
        req.setFcstsec(self.forecast)
36
37
        if self.level1 == '-1':
38
            f1 = -999999.0
39
        else:
40
            f1 = float(self.level1)
41
42
        if self.level2 == '-1':
43
            f2 = -999999.0
44
        else:
45
            f2 = float(self.level2)
46
47
        vcoord = self.vcoord
48
        if vcoord == 'SGMA':
49
            if f1 >= 0.0:
50
                f1 = f1 / 10000
51
            if f2 >= 0.0:
52
                f2 = f2 / 10000
53
        elif vcoord == 'DPTH':
54
            if f1 >= 0.0:
55
                f1 = f1 / 100.0
56
            if f2 >= 0.0:
57
                f2 = f2 / 100.0
58
        elif vcoord == 'POTV':
59
            if f1 >= 0.0:
60
                f1 = f1 / 1000.0
61
            if f2 >= 0.0:
62
                f2 = f2 / 1000.0
63
64
        req.setLevel1(str(f1))
65
        req.setLevel2(str(f2))
66
        req.setVcoord(vcoord)
67
68
        req.setParm(self.param)
69
70
        resp = self.client.sendRequest(req)
71
72
        # Get the dimensions of the grid
73
        kx = int(self.nx)
74
        ky = int(self.ny)
75
        kxky = kx * ky
76
77
        # Put the data into a NUMPY array
78
        grid = numpy.asarray(resp.getFloatData())
79
80
        # All grids need to be flipped from a GEMPAK point of view
81
        # Reshape the array into 2D
82
        grid = numpy.reshape(grid, (ky, kx))
83
        # Flip the array in the up-down direction
84
        grid = numpy.flipud(grid)
85
        # Reshape the array back into 1D
86
        grid = numpy.reshape(grid, kxky)
87
88
        return [replacemissing(x) for x in grid]
89
90
91
def getgriddata(server, table, model, cycle, forecast, level1,
92
                level2, vcoord, param, nnx, nny):
93
    gir = GridDataRetriever(server, table, model, cycle, forecast,
94
                            level1, level2, vcoord, param, nnx, nny)
95
    return gir.getData()
96
97
98
def getheader(server, table, model, cycle, forecast, level1,
99
              level2, vcoord, param, nnx, nny):
100
    idata = []
101
    idata.append(0)
102
    idata.append(0)
103
    return idata
104
105
106
def replacemissing(x):
107
    if x == -999999.0:
108
        return -9999.0
109
    return x
110
111
112
# This is the standard boilerplate that runs this script as a main
113
if __name__ == '__main__':
114
    # Run Test
115
    srv = 'edex-cloud.unidata.ucar.edu'
116
    tbl = 'grid'
117
    mdl = 'GFS20'
118
    cyc = '131227/0000'
119
    fcs = '43200'
120
    lv1 = '500'
121
    lv2 = '-1'
122
    vcd = 'PRES'
123
    prm = 'HGHT'
124
    nx = '720'
125
    ny = '361'
126
127
    print(getheader(srv, tbl, mdl, cyc, fcs, lv1, lv2, vcd, prm, nx, ny))
128
    print(getgriddata(srv, tbl, mdl, cyc, fcs, lv1, lv2, vcd, prm, nx, ny))
129