GridDataRetriever.getgriddata()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nop 11

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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