Completed
Push — master ( 98c26c...9e9700 )
by Michael
15:43
created

StationDataRetriever   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 137
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 17
eloc 107
dl 0
loc 137
rs 10
c 0
b 0
f 0

4 Functions

Rating   Name   Duplication   Size   Complexity  
A getstationdata() 0 13 3
C getleveldata() 0 27 9
A getheader() 0 4 1
A getstationtext() 0 8 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A StationDataRetriever.getStationData() 0 15 1
A StationDataRetriever.__init__() 0 9 1
1
import os
2
from datetime import datetime
3
from awips import ThriftClient
4
from dynamicserialize.dstypes.com.raytheon.uf.common.time import DataTime
5
from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange
6
from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import StationDataRequest
7
8
9
class StationDataRetriever:
10
    """ Retrieves all data for a requested station and time """
11
12
    def __init__(self, server, pluginName, stationId, refTime, parmList, partNumber):
13
        self.pluginName = pluginName
14
        self.stationId = stationId
15
        self.refTime = refTime
16
        self.parmList = parmList
17
        self.partNumber = partNumber
18
        self.host = os.getenv("DEFAULT_HOST", server)
19
        self.port = os.getenv("DEFAULT_PORT", "9581")
20
        self.client = ThriftClient.ThriftClient(self.host, self.port)
21
22
    def getStationData(self):
23
        """ Sends ThriftClient request and writes out received files."""
24
        dtime = datetime.strptime(self.refTime, "%y%m%d/%H%M")
25
        trange = TimeRange()
26
        trange.setStart(dtime)
27
        trange.setEnd(dtime)
28
        dataTime = DataTime(refTime=dtime, validPeriod=trange)
29
        req = StationDataRequest()
30
        req.setPluginName(self.pluginName)
31
        req.setStationId(self.stationId)
32
        req.setRefTime(dataTime)
33
        req.setParmList(self.parmList)
34
        req.setPartNumber(self.partNumber)
35
        resp = self.client.sendRequest(req)
36
        return resp
37
38
39
def getstationdata(server, table, stationId, refTime, parmList, partNumber):
40
    sr = StationDataRetriever(server, table, stationId, refTime, parmList, partNumber)
41
    lcldict = sr.getStationData()
42
43
    rdata = []
44
    
45
    for substr in parmList.split(','):
46
        if substr in lcldict:
47
            rdata.append(lcldict[substr])
48
        else:
49
            rdata.append(-9999.00)
50
51
    return rdata
52
53
54
def getleveldata(server, table, stationId, refTime, parmList, partNumber):
55
    sr = StationDataRetriever(server, table, stationId, refTime, parmList, partNumber)
56
    lcldict = sr.getStationData()
57
58
    numset = [1]
59
    for substr in parmList.split(','):
60
        if substr in lcldict:
61
            pnum = len(lcldict[substr]) - 1
62
            while pnum >= 0:
63
                if lcldict[substr][pnum] != -9999.00:
64
                    break
65
                pnum = pnum - 1
66
            numset.append(pnum)
67
68
    rdata = []
69
70
    for jj in range(max(numset)):
71
        for substr in parmList.split(','):
72
            if substr in lcldict:
73
                if lcldict[substr][jj] == -9999998.0:
74
                    rdata.append(-9999.0)
75
                else:
76
                    rdata.append(lcldict[substr][jj])
77
            else:
78
                rdata.append(-9999.0)
79
80
    return rdata
81
82
83
def getstationtext(server, table, stationId, refTime, parmList, partNumber):
84
    sr = StationDataRetriever(server, table, stationId, refTime, parmList, partNumber)
85
    lcldict = sr.getStationData()
86
87
    if parmList in lcldict:
88
        return lcldict[parmList]
89
    else:
90
        return ' '
91
92
93
def getheader(server, table, stationId, refTime, parmList, partNumber):
94
    idata = []
95
    idata.append(0)
96
    return idata
97
98
99
# This is the standard boilerplate that runs this script as a main
100
if __name__ == '__main__':
101
    # Run Test
102
    srv = 'edex-cloud.unidata.ucar.edu'
103
    key = '-'
104
    print('OBS - METAR')
105
    tbl = 'obs'
106
    stn = 'KLGA'
107
    time = '130823/1700'
108
    parm = 'seaLevelPress,temperature,dewpoint,windSpeed,windDir'
109
    part = '0'
110
    print(getheader(srv, tbl, stn, time, parm, part))
111
    print(getstationdata(srv, tbl, stn, time, parm, part))
112
    parm = 'rawMETAR'
113
    print(getstationtext(srv, tbl, stn, time, parm, part))
114
    print('SFCOBS - SYNOP')
115
    tbl = 'sfcobs'
116
    stn = '72403'
117
    time = '130823/1800'
118
    parm = 'seaLevelPress,temperature,dewpoint,windSpeed,windDir'
119
    part = '0'
120
    print(getheader(srv, tbl, stn, time, parm, part))
121
    print(getstationdata(srv, tbl, stn, time, parm, part))
122
    parm = 'rawReport'
123
    print(getstationtext(srv, tbl, stn, time, parm, part))
124
    print('UAIR')
125
    tbl = 'bufrua'
126
    stn = '72469'
127
    time = '130823/1200'
128
    parm = 'prMan,htMan,tpMan,tdMan,wdMan,wsMan'
129
    part = '2020'
130
    print(getleveldata(srv, tbl, stn, time, parm, part))
131
    parm = 'prSigT,tpSigT,tdSigT'
132
    part = '2022'
133
    print(getleveldata(srv, tbl, stn, time, parm, part))
134
    parm = 'htSigW,wsSigW,wdSigW'
135
    part = '2021'
136
    print(getleveldata(srv, tbl, stn, time, parm, part))
137