awips2/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/MesowestDecoder.py
root 9f19e3f712 Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: 64fa9254b946eae7e61bbc3f513b7c3696c4f54f
2012-01-06 08:55:05 -06:00

129 lines
5 KiB
Python

##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
import sys, os, time, re, string, getopt
import copy
import LogStream
import pupynere
from com.raytheon.uf.common.pointdata.spatial import SurfaceObsLocation
from java.lang import Double
from java.lang import Integer
class MesowestDecoder():
def __init__(self, text=None, filePath=None):
self._parameters = ['altimeter', 'dewpoint', 'relHumidity', 'stationId', 'rawMessage', 'temperature', 'windDir', 'windGust', 'windSpeed', 'precipAccum']
self._mappings = ['altimeter', 'dwpt', 'humidity', 'stationId', 'obsText', 'temp', 'windDirection', 'windGust', 'windSpeed', 'precip']
#to ensure time calls are based on Zulu
os.environ['TZ'] = "GMT0"
self._deleteAfterProcessing = 0
if filePath is None:
self._incomingFilename = None
else:
self._incomingFilename = filePath
def decode(self):
fillValue = None
missing = None
mesowestReports = list()
obsList = dict()
net = pupynere.netcdf_file(self._incomingFilename,"r")
records = net._recs
for x in range(records):
stationId = ''.join(net.variables['stationId'][x])
reportTime = net.variables['reportTime'][x] * 1000
if obsList.has_key(reportTime):
if stationId in obsList[reportTime]:
continue
else:
obsList[reportTime].append(stationId)
else:
obsList[reportTime] = list()
obsList[reportTime].append(stationId)
mesowestReport = dict()
for paramNum in range(len(self._parameters)):
param = self._parameters[paramNum]
mapping = self._mappings[paramNum]
variable = net.variables[param]
# Set the missing value if available
try:
missing = variable.missing_value
except AttributeError:
missing = None
# Set the fill value if available
try:
fillValue = variable._FillValue
except AttributeError:
fillValue = None
if len(variable.shape) == 1:
if fillValue != None and variable[x] == fillValue:
mesowestReport[mapping] = Double(-9999.0)
continue
if missing != None:
# Odd case where certain values are -764 in the netcdf
if variable[x] == missing or variable[x] < -600:
mesowestReport[mapping] = Double(-9999.0)
continue
mesowestReport[mapping] = Double.valueOf(str(variable[x]))
elif len(variable.shape) > 1 and variable.shape[1] > 3:
mesowestReport[mapping] = ''.join(variable[x])
location = SurfaceObsLocation()
lat = Double.valueOf(str(net.variables['latitude'][x]))
lon = Double.valueOf(str(net.variables['longitude'][x]))
elv = Double.valueOf(str(net.variables['elevation'][x]))
location.assignLocation(lat.doubleValue(),lon.doubleValue());
location.setElevation(Integer(elv.intValue()));
location.setStationId(stationId)
mesowestReport['location'] = location
mesowestReport['timeObs'] = long(reportTime)
mesowestReport['dataTime'] = mesowestReport['timeObs']
mesowestReport['networkType'] = ''.join(net.variables['stationType'][x])
mesowestReports.append(mesowestReport)
net.close()
return mesowestReports
def _usage(self):
#Prints out usage information if started without sufficient command
#line arguments.
s = "This tool is not meant to be run from the command line."
print s
LogStream.logProblem(s)
def main():
try:
LogStream.logEvent("MesowestDecoder Starting")
decoder = MesowestDecoder()
decoder.decode()
decoder = None
LogStream.logEvent("MesowestDecoder Finished")
except:
LogStream.logProblem("Caught Exception: ", LogStream.exc())
sys.exit(1)
if __name__ == "__main__":
main()
sys.exit(0)