diff --git a/data/acars/a2acars.csh b/data/acars/a2acars.csh new file mode 100755 index 0000000..4c146db --- /dev/null +++ b/data/acars/a2acars.csh @@ -0,0 +1,128 @@ +#!/bin/csh +## +# 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. +## + + +# +# A script wrapper around a UEngine call that is meant to get all available +# acars data in the A-II database over a specified range of times. +# The data is output to stdout as ASCII. Each line is one time/platform +# combination. The individual data items are comma delimited. +# This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2acars.csh {p} yyyy-mm-dd hh:mm yyyy-mm-dd hh:mm +# +# The literal p flag is optional. The p flag means preserve +# the final version of the python submitted to the UEngine instead of +# cleaning it up. The path to the finalized python is /tmp/a2acarsNNNNN.py +# where NNNNN is a unix process id. This flag does nothing when using the +# DataAccessFramework. +# +# This outputs the following set of variables for each line: +# +# tailNumber,asciitime,latitude,longitude,acarsReceivingStation, +# pressure,flightPhase,rollQuality,temperature,windDir,windSpeed, +# relHumidity,mixRatio +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 07/23/2014 3392 nanbowle Initial modification. Passes parameters straight to DAF script instead of using sed. +# +# +# + + +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./a2acarsStub.py ) then + set stubpy = ./a2acarsStub.py +else if ( -e $mydir/a2acarsStub.py ) then + set stubpy = $mydir/a2acarsStub.py +else if ( -e $FXA_HOME/src/dm/bufr/acars/a2acarsStub.py ) then + set stubpy = $FXA_HOME/src/dm/bufr/acars/a2acarsStub.py +else if ( -e $FXA_HOME/bin/a2acarsStub.py ) then + set stubpy = $FXA_HOME/bin/a2acarsStub.py +else + bash -c "echo could not find a2acarsStub.py 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set specpy = /tmp/a2acars${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" > $specpy + + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | grep -v Response + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + diff --git a/data/acars/a2acarsStub.py b/data/acars/a2acarsStub.py new file mode 100644 index 0000000..2976b81 --- /dev/null +++ b/data/acars/a2acarsStub.py @@ -0,0 +1,184 @@ +## +# 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. +## + + +# +# Gets all available acars data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. Each line is one time/platform +# combination. The individual data items are comma delimited. +# +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 07/23/2014 3392 nabowle Initial modification. Replaces UEngine with DAF. +# 07/28/2014 3392 nabowle Strip tail and receiver to match original formatting. +# 09/04/2014 3405 nabowle NO_DATA and date to string extracted to a2dafcommon +# +# + + +import a2dafcommon +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + return parser.parse_args() + +def main(): + user_args = get_args() + + # Set the host in the DataAcessLayer if supplied + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + + req = DataAccessLayer.newDataRequest("acars") + req.setParameters("tailNumber", "receiver", "pressure", "flightPhase", + "rollAngleQuality", "temp", "windDirection", "windSpeed", + "humidity", "mixingRatio", "icing") + + + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if len(geometries) == 0: +# print("No data available.") + return + + for geoData in geometries: + mytail = geoData.getString("tailNumber") + if a2dafcommon.is_no_data(mytail): + mytail = "" + else: + mytail = mytail.strip() + + mytime = geoData.getDataTime() + if mytime == None: + continue + #2014-07-16 00:00:00 (0) => 2014-07-16_00:00:00 + mytime = a2dafcommon.datatime_to_string(mytime) + + geo = geoData.getGeometry() + if geo == None: + continue + mylon = geo.x + mylat = geo.y + if a2dafcommon.is_no_data(mylat) or a2dafcommon.is_no_data(mylon): + continue + mylat = "%.4f"%float(mylat) + mylon = "%.4f"%float(mylon) + + myrec = geoData.getString("receiver") + if a2dafcommon.is_no_data(myrec): + myrec = "" + else: + myrec = myrec.strip() + + mypres = geoData.getNumber("pressure") + if a2dafcommon.is_no_data(mypres): + mypres = "1e37" + else : + mypres = "%.0f"%mypres + + myphs = geoData.getString("flightPhase") + if a2dafcommon.is_no_data(myphs): + myphs = "7" + else : + myphs = "%d"%int(myphs) + + myrol = geoData.getString("rollAngleQuality") + if a2dafcommon.is_no_data(myrol): + myrol = "3" + else : + myrol = "%d"%int(myrol) + + mytemp = geoData.getNumber("temp") + if a2dafcommon.is_no_data(mytemp): + mytemp = "1e37" + else : + mytemp = "%.1f"%mytemp + + mydir = geoData.getString("windDirection") + if a2dafcommon.is_no_data(mydir): + mydir = "1e37" + else : + mydir = "%d"%int(mydir) + + myspd = geoData.getNumber("windSpeed") + if a2dafcommon.is_no_data(myspd): + myspd = "1e37" + else : + myspd = "%.1f"%myspd + + myhum = geoData.getNumber("humidity") + if a2dafcommon.is_no_data(myhum): + myhum = "1e37" + else : + myhum = "%.0f"%myhum + + mymix = geoData.getNumber("mixingRatio") + if a2dafcommon.is_no_data(mymix): + mymix = "1e37" + else : + mymix = "%.2f"%mymix + +# Icing was commented out of the uengine version +# myicg = geoData.getString("icing") +# if a2dafcommon.is_no_data(myicg): +# myicg = "1e37" +# else : +# myicg = "%d"%int(myicg) + + msg = mytail + "," + mytime + "," + mylat + "," + mylon + "," + \ + myrec + "," + mypres + "," + myphs + "," + myrol + "," + \ + mytemp + "," + mydir + "," + myspd + "," + myhum + "," + mymix + print msg + +if __name__ == '__main__': + main() diff --git a/data/aireppirep/a2aircraft.csh b/data/aireppirep/a2aircraft.csh new file mode 100644 index 0000000..53fcb36 --- /dev/null +++ b/data/aireppirep/a2aircraft.csh @@ -0,0 +1,228 @@ +#!/bin/csh +## +# 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. +## + +# +# A script wrapper around a UEngine call that is meant to get all available +# maritime data in the A-II database over a specified range of times. +# The data is output to stdout as ASCII. Each line is one time/platform +# combination. The individual data items are comma delimited. +# This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2aircraft.csh {p} {t} yyyy-mm-dd hh:mm yyyy-mm-dd hh:mm +# +# The literal p flag is optional. The p flag means preserve +# the final version of the python submitted to the UEngine instead of +# cleaning it up. The path to the finalized python is /tmp/a2aircraftNNNNN.py +# where NNNNN is a unix process id. This flag does nothing when using the DAF +# version. +# +# The optional literal t mean change some of the ascii phenomena descriptions +# for pireps into codes suitable for D-2D format aircraft data files. +# +# This outputs the following set of variables for each line: +# +# lat|lon,asciitime,flightLevel,reportType,aircraftType, +# temperature,windDir,windSpeed,visibility, +# FlightWeather*,FlightHazard*,FlightConditions*,WeatherGroup*, +# numCloudLayers,cloudBaseHeight,cloudTopHeight,cloudAmount, +# numIcingLayers,heightBaseIcing,heightTopIcing,typeIcing,intensityOfIcing, +# numTurbulenceLayers,heightBaseTurb,heightTopTurb, +# typeTurbulence,intensityOfTurbulence +# +# Asterisk (*) means variable that does not directly correspond to a +# variable in the D-2D format aircraft data files. +# +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/02/2014 3405 nabowle Initial modification to better handle daf. +# +# +set rmpy = yes +set typcod = qwertyuiop +if ( "$1" == "t" ) then + set typcod = "typecode = 'no'" + shift +endif +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +set repType = "" +set rt = `echo $1 | tr 'a-z' 'A-Z' | grep '^.IREP$'` +if ( "$rt" != "" ) then + set repType = $rt + shift +endif +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +if ( "$1" == "t" ) then + set typcod = "typecode = 'no'" + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./a2airepStub.py ) then + set stubpy = ./a2airepStub.py +else if ( -e $mydir/a2airepStub.py ) then + set stubpy = $mydir/a2airepStub.py +else if ( -e $FXA_HOME/src/dm/bufr/acars/a2airepStub.py ) then + set stubpy = $FXA_HOME/src/dm/bufr/acars/a2airepStub.py +else if ( -e $FXA_HOME/bin/a2airepStub.py ) then + set stubpy = $FXA_HOME/bin/a2airepStub.py +else + bash -c "echo could not find a2airepStub.py 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set method = "daf" + if ( "$repType" != "PIREP" ) then + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" --match-legacy +# /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" + endif +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + # + set specpy = /tmp/a2airep${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" > $specpy + if ( "$repType" != "PIREP" ) then + set here = `pwd` + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | grep -v Response + cd $here + endif + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./a2pirepStub.py ) then + set stubpy = ./a2pirepStub.py +else if ( -e $mydir/a2pirepStub.py ) then + set stubpy = $mydir/a2pirepStub.py +else if ( -e $FXA_HOME/src/dm/bufr/acars/a2pirepStub.py ) then + set stubpy = $FXA_HOME/src/dm/bufr/acars/a2pirepStub.py +else if ( -e $FXA_HOME/bin/a2pirepStub.py ) then + set stubpy = $FXA_HOME/bin/a2pirepStub.py +else + bash -c "echo could not find a2pirepStub.py 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set method = "daf" + if ( "$repType" != "AIREP" ) then + # By default, match the legacy output. + set pyargs = "--match-legacy" +# set pyargs = "" + if ( "$typcod" != "qwertyuiop" ) then + set pyargs = "$pyargs -t" + endif + + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" $pyargs + endif +else + if ( "$method" == "daf" ) then + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + endif + + # + set specpy = /tmp/a2pirep${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" | \ + grep -v "$typcod" > $specpy + cd $UE_BIN_PATH + if ( "$repType" != "AIREP" ) then + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | grep -v Response + endif + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + diff --git a/data/aireppirep/a2airepStub.py b/data/aireppirep/a2airepStub.py new file mode 100644 index 0000000..ad219be --- /dev/null +++ b/data/aireppirep/a2airepStub.py @@ -0,0 +1,168 @@ +## +# 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. +## + + +# +# Gets all available pirep data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. Each line is one record. +# The individual data items are comma delimited. +# +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/25/2014 3405 nabowle Initial modification. Replaces UEngine with DAF. +# +# + + +import a2dafcommon +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + parser.add_argument("--match-legacy", action="store_true", dest="match", + help="If set, the legacy script output will be matched.", + default=False) + return parser.parse_args() + + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("airep") + req.setParameters("id", "flightLevel", "temp", "windDirection", "windSpeed", + "flightWeather", "flightHazard", "flightConditions") + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "No data available." + return + + msg = ""; + + geometries.sort(key=lambda geo: str(geo.getDataTime())) + for geoData in geometries : + mytime = geoData.getDataTime() + if not mytime: + continue + mytime = a2dafcommon.datatime_to_string(mytime) + + geo = geoData.getGeometry() + if not geo: + continue + + mylon = geo.x + mylat = geo.y + if a2dafcommon.is_no_data(mylat) or a2dafcommon.is_no_data(mylon): + continue + mylat = "%.4f"%mylat + mylon = "%.4f"%mylon + + myflvl = geoData.getNumber("flightLevel") + if a2dafcommon.is_no_data(myflvl) : + myflvl = "1e37" + else : + myflvl = "%d"%myflvl + +# Temp is not stored. +# mytemp = geoData.getString("temp") +# if a2dafcommon.is_no_data(mytemp) : +# mytemp = "1e37" +# else : +# mytemp = "%.1f"%float(mytemp) + mytemp = "1e37" + +# Wind Direction is not stored. +# mydir = geoData.getString("windDirection") +# if a2dafcommon.is_no_data(mydir) : +# mydir = "1e37" +# else : +# mydir = "%d"%int(mydir) + mydir = "1e37" + + myspd = geoData.getNumber("windSpeed") + if a2dafcommon.is_no_data(myspd) : + myspd = "1e37" + else : + myspd = "%.1f"%myspd + + myfwx = geoData.getNumber("flightWeather") + if myfwx : + myfwx = "-1" + else : + myfwx = "%d"%myfwx + + myhaz = geoData.getNumber("flightHazard") + if a2dafcommon.is_no_data(myhaz) : + myhaz = "-1" + else : + myhaz = "%d"%myhaz + + mycond = geoData.getNumber("flightConditions") + if a2dafcommon.is_no_data(mycond) : + mycond = "-1" + else : + mycond = "%d"%mycond + + if user_args.match: +# Wind Speed not returned to legacy script. + myspd = "1e37" + + msg += mylat + "|" + mylon + "," + mytime + "," + myflvl + ",AIREP,," + \ + mytemp + "," + mydir + "," + myspd + ",1e37," + \ + myfwx + "," + myhaz + "," + mycond + ",,0,,,,0,,,,,0,,,,\n" + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/aireppirep/a2pirepStub.py b/data/aireppirep/a2pirepStub.py new file mode 100644 index 0000000..77f3f6e --- /dev/null +++ b/data/aireppirep/a2pirepStub.py @@ -0,0 +1,385 @@ +## +# 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. +## + + +# +# Gets all available pirep data in the A-II database over a specified time +# range. The data is output to stdout as ASCII. Each line is one record. The +# individual data items are comma delimited. +# +# The legacy script does not retrieve any values not stored in the postgres db. +# To compensate for this in side-by-side comparison, a --match-legacy flag is +# provided that will ignore these fields. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/25/2014 3405 nabowle Initial modification. Replaces UEngine with DAF. +# +# + + +import a2dafcommon +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + + + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + parser.add_argument("--match-legacy", action="store_true", dest="match", + help="If set, the legacy script output will be matched.", + default=False) + parser.add_argument("-t", action="store_true", dest="typecode", + help="If set, more type information is displayed.", + default=False) + return parser.parse_args() + + +def main(): + MULTI_DIM_PARAMS = set(["hazardType", + "turbType", "turbBaseHeight", "turbTopHeight", + "iceType", "iceBaseHeight", "iceTopHeight", + "skyCover1", "skyCover2", "skyBaseHeight", "skyTopHeight" + ]) + + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("pirep") + req.setParameters('id', 'flightLevel', 'temp', 'windDirection', 'windSpeed', + 'horzVisibility', 'aircraftType', 'weatherGroup') + req.getParameters().extend(MULTI_DIM_PARAMS) + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "No data available." + return + + typecode = user_args.typecode + match = user_args.match + msg = "" + layerData = [] + combinedGeos = [] + for geoData in geometries : +# The DAF returns multi-dimensional parameters as separate results before +# the base result that contain the single-dimensional parameters. +# Because of the separation of parameters and known ordering of result +# types, we can easily figure out what each result is and correlate the +# ancillary data with the base data. + if set(geoData.getParameters()) & MULTI_DIM_PARAMS : + layerData.append(geoData) + continue + + combinedGeos.append({"base":geoData, "layers":layerData}) + layerData = [] + + combinedGeos.sort(key=lambda geoMap: str(geoMap['base'].getDataTime())) + + for geoMap in combinedGeos : + geoData = geoMap['base'] + layerData = geoMap['layers'] + + mytime = geoData.getDataTime() + if not mytime: + continue + mytime = mytime = a2dafcommon.datatime_to_string(mytime) + + geo = geoData.getGeometry() + if not geo: + continue + + mylon = geo.x + mylat = geo.y + if a2dafcommon.is_no_data(mylat) or a2dafcommon.is_no_data(mylon) : + continue + mylat = "%.4f"%mylat + mylon = "%.4f"%mylon + + myflvl = geoData.getNumber("flightLevel") + if a2dafcommon.is_no_data(myflvl) : + myflvl = "1e37" + else : + myflvl = "%d"%myflvl + +# Temp is not stored. +# mytemp = geoData.getNumber("temp") +# if a2dafcommon.is_no_data(mytemp) : +# mytemp = "1e37" +# else : +# mytemp = "%.1f"%float(mytemp) + mytemp = "1e37" + +# Wind Direction is not stored. +# mydir = geoData.getString("windDirection") +# if a2dafcommon.is_no_data(mydir) : +# mydir = "1e37" +# else : +# mydir = "%d"%int(mydir) + mydir = "1e37" + + myspd = geoData.getNumber("windSpeed") + if a2dafcommon.is_no_data(myspd) : + myspd = "1e37" + else : + myspd = "%.1f"%myspd + + myvis = geoData.getNumber("horzVisibility") + if a2dafcommon.is_no_data(myvis) : + myvis = "1e37" + else : + myvis = "%.1f"%myvis + + mycraft = geoData.getString("aircraftType") + if a2dafcommon.is_no_data(mycraft) : + mycraft = "" + + mywx = geoData.getString("weatherGroup") + if a2dafcommon.is_no_data(mywx) : + mywx = "" + + + cc = 0 + cldBas = "" + cldTop = "" + cldVal = "" + ii = 0 + icgBas = "" + icgTop = "" + icgTyp = "" + icgVal = "" + tt = 0 + trbBas = "" + trbTop = "" + trbTyp = "" + trbVal = "" + + if match : +# Speed, Horizontal Visibility, aircraft type, and weather group are +# not returned to the legacy script. Flightlevel of -9999 is output +# as such instead of being replaced by "1e37" + myspd = "1e37" + myvis = "-9999998.0" + mycraft = "" + mywx = "" + if geoData.getNumber("flightLevel") == -9999: + myflvl = "-9999" + else : + for pld in layerData: + sep = "" + ltyp = pld.getString("hazardType") + if a2dafcommon.is_no_data(ltyp) : + continue + + fval = pld.getString("skyCover1") + if fval == "None" : + fval = "" + + sval = pld.getString("skyCover2") + if sval == "None" : + sval = "" + if ltyp == "CLOUD" : + if fval == "TOP" : + fval = "" + if sval == "TOP" : + sval = "" + if sval != "" : + fval += "-"+sval + if typecode : + if fval == "CLR" : + fval = "0" + elif fval == "OVC" : + fval = "8" + elif fval == "SCT" : + fval = "11" + elif fval == "BKN" : + fval = "12" + elif fval == "FEW" : + fval = "13" + else : + continue + if cldBas != "" : + sep = "|" + + base = pld.getNumber("skyBaseHeight") + if a2dafcommon.is_no_data(base) or base == 99999 : + base = "1e37" + else : + base = "%.0f"%float(base) + + top = pld.getNumber("skyTopHeight") + if a2dafcommon.is_no_data(top) or top == 99999 : + top = "1e37" + else : + top = "%.0f"%float(top) + + cldBas += sep+base + cldTop += sep+top + cldVal += sep+fval + cc += 1 + elif ltyp == "ICING" : + dtyp = pld.getString("iceType") + if a2dafcommon.is_no_data(dtyp) : + dtyp = "" + + if sval != "" : + fval += "-"+sval + if icgBas != "" : + sep = "|" + if typecode : + if dtyp == "RIME" : + dtyp = "1" + elif dtyp == "CLR" : + dtyp = "2" + elif dtyp == "MXD" : + dtyp = "3" + else : + dtyp = "-9999" + if fval == "NEG" : + fval = "0"; + elif fval == "TRACE" : + fval = "1" + elif fval == "TRACE-LGT" : + fval = "2" + elif fval == "LGT" : + fval = "3" + elif fval == "LGT-MOD" : + fval = "4" + elif fval == "MOD" : + fval = "5" + elif fval == "MOD-SEV" : + fval = "7" + elif fval == "SEV" : + fval = "8" + else : + fval = "-9999" + if fval == "-9999" and dtyp == "-9999" : + continue + + base = pld.getNumber("iceBaseHeight") + if a2dafcommon.is_no_data(base) or base == 99999 : + base = "1e37" + else : + base = "%.0f"%float(base) + + top = pld.getNumber("iceTopHeight") + if a2dafcommon.is_no_data(top) or top == 99999 : + top = "1e37" + else : + top = "%.0f"%float(top) + + icgBas += sep+base + icgTop += sep+top + icgTyp += sep+dtyp + icgVal += sep+fval + ii += 1 + elif ltyp == "TURBC" : + dtyp = pld.getString("turbType") + if a2dafcommon.is_no_data(dtyp) : + dtyp = "" + + if sval != "" : + fval += "-"+sval + if typecode : + if dtyp == "CAT" : + dtyp = "1" + elif dtyp == "CHOP" : + dtyp = "2" + else : + dtyp = "-9999" + if fval == "NEG" : + fval = "0"; + elif fval == "LGT" : + fval = "2" + elif fval == "LGT-MOD" : + fval = "3" + elif fval == "MOD" : + fval = "4" + elif fval == "MOD-SEV" : + fval = "5" + elif fval == "SEV" : + fval = "6" + elif fval == "EXTRM" : + fval = "8" + else : + fval = "-9999" + if fval == "-9999" and dtyp == "-9999" : + continue + if trbBas != "" : + sep = "|" + + base = pld.getNumber("turbBaseHeight") + if a2dafcommon.is_no_data(base) or base == 99999 : + base = "1e37" + else : + base = "%.0f"%float(base) + + top = pld.getNumber("turbTopHeight") + if a2dafcommon.is_no_data(top) or top == 99999 : + top = "1e37" + else : + top = "%.0f"%float(top) + + trbBas += sep+base + trbTop += sep+top + trbTyp += sep+dtyp + trbVal += sep+fval + tt += 1 + + msg += mylat + "|" + mylon + "," + mytime + "," + myflvl + ",PIREP," + \ + mycraft + "," + mytemp + "," + mydir + "," + myspd + "," + \ + myvis + ",-1,-1,-1," + mywx + "," + \ + str(cc) + "," + cldBas + "," + cldTop + "," + cldVal + "," + \ + str(ii) + "," + icgBas + "," + icgTop + "," + \ + icgTyp + "," + icgVal + "," + \ + str(tt) + "," + trbBas + "," + trbTop + "," + \ + trbTyp + "," + trbVal + "\n" + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/common/UEngine.cshsrc b/data/common/UEngine.cshsrc new file mode 100755 index 0000000..59c98da --- /dev/null +++ b/data/common/UEngine.cshsrc @@ -0,0 +1,28 @@ +# +# Set up the environment we need to run the UEngine. +# +#set release = "" +#if ( -e /awips2/edex/conf/banner.txt ) then +# set release = `grep Version /awips2/edex/conf/banner.txt | tr '*' ' ' | \ +# sed 's/ *$//g' | sed 's/^.* //g'` +#endif +# +while (1) + if ( $?INSTALL_BASE ) then + if ( -d $INSTALL_BASE/python ) break + endif + setenv INSTALL_BASE /awips2 + break +end +if ( -e $INSTALL_BASE/bin/uengine ) then + setenv UE_BIN_PATH $INSTALL_BASE/bin +else + setenv UE_BIN_PATH $INSTALL_BASE/fxa/bin +endif +if ( ! $?PRE_ADE_PATH ) then + setenv PRE_ADE_PATH ${PATH} +endif +setenv JAVA_HOME $INSTALL_BASE/java +setenv LD_LIBRARY_PATH /usr/lib +setenv PYTHONPATH .:$INSTALL_BASE/bin/src +setenv PATH ${JAVA_HOME}/bin:${UE_BIN_PATH}:${PRE_ADE_PATH} diff --git a/data/common/a2dafcommon.py b/data/common/a2dafcommon.py new file mode 100644 index 0000000..ee3a7b0 --- /dev/null +++ b/data/common/a2dafcommon.py @@ -0,0 +1,43 @@ +## +# 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. +## + + +# +# Common functionality for MSAS/LAPS scripts using the Data Acess Framework. +# +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/02/2014 3405 nabowle Initial creation. +# +# + +NO_DATA = [None, "None", -9999, -9999.0, "-9999", "-9999.0", ""] + +def is_no_data(val): + return val in NO_DATA + + +def datatime_to_string(datatime): + return str(datatime)[0:19].replace(" ","_") diff --git a/data/common/gtasUtil b/data/common/gtasUtil new file mode 100644 index 0000000..aa73c56 Binary files /dev/null and b/data/common/gtasUtil differ diff --git a/data/common/msgCodeSeds.txt b/data/common/msgCodeSeds.txt new file mode 100644 index 0000000..cac25bf --- /dev/null +++ b/data/common/msgCodeSeds.txt @@ -0,0 +1,108 @@ +# 35 36 37 38 41 50 51 57 65 66 67 81 85 86 90 +s/^0 *$/0|STImotion/g +s/^2 *$/2|GSM/g +s/^3 *$/3|PRR/g +s/^6 *$/6|AAP/g +s/^8 *$/8|PTL/g +s/^9 *$/9|AM/g +s/^16 *$/16|Z 1km 3bit/g +s/^17 *$/17|Z 2km 3bit/g +s/^18 *$/18|Z 4km 3bit/g +s/^19 *$/19|Z 1km 4bit/g +s/^20 *$/20|Z 2km 4bit/g +s/^21 *$/21|Z 4km 4bit/g +s/^22 *$/22|V 0.25km 3bit/g +s/^23 *$/23|V 0.5km 3bit/g +s/^24 *$/24|V 1km 3bit/g +s/^25 *$/25|V 0.25km 4bit/g +s/^26 *$/26|V 0.5km 4bit/g +s/^27 *$/27|V 1km 4bit/g +s/^28 *$/28|SW 0.25km 3bit/g +s/^29 *$/29|SW 0.5km 3bit/g +s/^30 *$/30|SW 1km 3bit/g +s/^31 *$/31|USP 2km 4bit/g +s/^32 *$/32|DHR 1km 8bit/g +s/^33 *$/33|HSR 1km 4bit/g +s/^34 *$/34|CFC 1km 3bit/g +s/^35 *$/35|CZ 1km 3bit/g +s/^36 *$/36|CZ 4km 3bit/g +s/^37 *$/37|CZ 1km 4bit/g +s/^38 *$/38|CZ 4km 4bit/g +s/^41 *$/41|ET 4km 4bit/g +s/^48 *$/48|VWP/g +s/^50 *$/50|RCS 1km 4bit/g +s/^51 *$/51|VCS 0.5km 4bit/g +s/^55 *$/55|SRR 0.5km 4bit/g +s/^56 *$/56|SRM 1km 4bit/g +s/^57 *$/57|VIL 4km 4bit/g +s/^58 *$/58|STI/g +s/^59 *$/59|HI/g +s/^60 *$/60|M/g +s/^61 *$/61|TVS/g +s/^62 *$/62|SS/g +s/^65 *$/65|LRM 4km 3bit/g +s/^66 *$/66|LRM 4km 3bit/g +s/^67 *$/67|APR 4km 3bit/g +s/^73 *$/73|UAM/g +s/^74 *$/74|RCM/g +s/^75 *$/75|FTM/g +s/^78 *$/78|OHP 2km 4bit/g +s/^79 *$/79|THP 2km 4bit/g +s/^80 *$/80|STP 2km 4bit/g +s/^81 *$/81|DPA 4km 8bit/g +s/^82 *$/82|SPD 40km 3bit/g +s/^84 *$/84|VAD/g +s/^85 *$/85|RCS 1km 3bit/g +s/^86 *$/86|VCS 0.5km 3bit/g +s/^90 *$/90|LRM 4km 3bit/g +s/^93 *$/93|DBV 1km 8bit/g +s/^94 *$/94|Z 1km 8bit/g +s/^99 *$/99|V 0.25km 8bit/g +s/^100 *$/100|VSDT/g +s/^101 *$/101|STIT/g +s/^102 *$/102|HIT/g +s/^103 *$/103|MT/g +s/^104 *$/104|TVST/g +s/^107 *$/107|OHPT/g +s/^108 *$/108|THPT/g +s/^109 *$/109|STPT/g +s/^132 *$/132|CLR 1km 4bit/g +s/^133 *$/133|CLD 1km 4bit/g +s/^134 *$/134|DVL 1km 8bit/g +s/^135 *$/135|EET 1km 8bit/g +s/^136 *$/136|SO/g +s/^137 *$/137|ULR 1km 4bit/g +s/^138 *$/138|STP 2km 8bit/g +s/^139 *$/139|MRU/g +s/^140 *$/140|GFM/g +s/^141 *$/141|MD/g +s/^143 *$/143|TRU/g +s/^144 *$/144|OSW 2km 4bit/g +s/^145 *$/145|OSD 2km 4bit/g +s/^146 *$/146|SSW 2km 4bit/g +s/^147 *$/147|SSD 2km 4bit/g +s/^149 *$/149|DMD/g +s/^150 *$/150|USW 2km 4bit/g +s/^151 *$/151|USD 2km 4bit/g +s/^152 *$/152|RSS/g +s/^153 *$/153|Z 0.25km 0.5Deg 8bit/g +s/^154 *$/154|V 0.25km 0.5Deg 8bit/g +s/^155 *$/155|SW 0.25km 0.5Deg 8bit/g +s/^158 *$/158|ZDR 1km 4bit/g +s/^159 *$/159|ZDR 0.25km 8bit/g +s/^160 *$/160|CC 1km 4bit/g +s/^161 *$/161|CC 0.25km 8bit/g +s/^162 *$/162|KDP 1km 4bit/g +s/^163 *$/163|KDP 0.25km 8bit/g +s/^164 *$/164|HC 1km 4bit/g +s/^165 *$/165|HC 0.25km 8bit/g +s/^166 *$/166|ML/g +s/^169 *$/169|OHA 2km 4bit/g +s/^170 *$/170|DAA 0.25km 8bit/g +s/^171 *$/171|STA 2km 4bit/g +s/^172 *$/172|STA 0.25km 8bit/g +s/^173 *$/173|DUA 0.25km 8bit/g +s/^174 *$/174|DOD 0.25km 8bit/g +s/^175 *$/175|DSD 0.25km 8bit/g +s/^176 *$/176|DPR 0.25km gen/g +s/^177 *$/177|HHC 0.25km 8bit/g diff --git a/data/common/wmoToNameRaob.txt b/data/common/wmoToNameRaob.txt new file mode 100755 index 0000000..425a31b --- /dev/null +++ b/data/common/wmoToNameRaob.txt @@ -0,0 +1,290 @@ +s/^04202,/BGTL,/g +s/^08594,/GVAC,/g +s/^21824,/RUTS,/g +s/^25563,/UHMA,/g +s/^25594,/UHMD,/g +s/^25913,/UHMM,/g +s/^31329,/UHPB,/g +s/^31735,/RUHB,/g +s/^31960,/UHWW,/g +s/^32150,/RUSH,/g +s/^32540,/UHPP,/g +s/^46692,/RCSS,/g +s/^46697,/RCGM,/g +s/^46747,/RCMJ,/g +s/^47058,/ZKKK,/g +s/^47110,/RKSS,/g +s/^47122,/RKSO,/g +s/^47138,/RKTH,/g +s/^47158,/RKJJ,/g +s/^47187,/RKPM,/g +s/^47401,/RJCW,/g +s/^47412,/RJCO,/g +s/^47580,/RJSM,/g +s/^47582,/RJSK,/g +s/^47590,/RJSS,/g +s/^47678,/RJTH,/g +s/^47681,/RJNH,/g +s/^47808,/RJFF,/g +s/^47827,/RJFK,/g +s/^47881,/RJOS,/g +s/^47918,/ROIG,/g +s/^47931,/RODN,/g +s/^47936,/ROAH,/g +s/^47945,/ROMD,/g +s/^47971,/RJAO,/g +s/^47981,/RJAW,/g +s/^47991,/RJAM,/g +s/^50745,/ZYQQ,/g +s/^50953,/ZYHB,/g +s/^54161,/ZYCC,/g +s/^54342,/ZYYY,/g +s/^54662,/ZYTL,/g +s/^54857,/ZSQD,/g +s/^58457,/ZSHC,/g +s/^61641,/GOOY,/g +s/^61902,/FHAW,/g +s/^61967,/DJDG,/g +s/^70026,/PABR,/g +s/^70086,/PABA,/g +s/^70133,/PAOT,/g +s/^70200,/PAOM,/g +s/^70219,/PABE,/g +s/^70231,/PAMC,/g +s/^70261,/PAFA,/g +s/^70273,/PAFC,/g +s/^70308,/PASN,/g +s/^70316,/PACB,/g +s/^70326,/PAKN,/g +s/^70350,/PADQ,/g +s/^70361,/PAYA,/g +s/^70398,/PANT,/g +s/^70414,/PASY,/g +s/^71043,/CYVQ,/g +s/^71051,/CWSY,/g +s/^71081,/CYUX,/g +s/^71082,/CYLT,/g +s/^71109,/CYZT,/g +s/^71119,/CWEG,/g +s/^71120,/CYOD,/g +s/^71121,/CYED,/g +s/^71123,/CYEG,/g +s/^71203,/CYLW,/g +s/^71396,/CYHZ,/g +s/^71399,/CWOS,/g +s/^71600,/CWSA,/g +s/^71603,/CYQI,/g +s/^71624,/CYYZ,/g +s/^71627,/CYUL,/g +s/^71701,/CYCX,/g +s/^71722,/CWMW,/g +s/^71799,/CYYJ,/g +s/^71801,/CYYT,/g +s/^71807,/CWAR,/g +s/^71811,/CYZV,/g +s/^71815,/CYJT,/g +s/^71816,/CYYR,/g +s/^71823,/CYAH,/g +s/^71836,/CYMO,/g +s/^71845,/CWPL,/g +s/^71853,/CWLO,/g +s/^71867,/CYQD,/g +s/^71879,/CYXD,/g +s/^71896,/CYXS,/g +s/^71906,/CYVP,/g +s/^71907,/CYPH,/g +s/^71909,/CYFB,/g +s/^71913,/CYYQ,/g +s/^71915,/CYZS,/g +s/^71917,/CWEU,/g +s/^71924,/CYRB,/g +s/^71925,/CYCB,/g +s/^71926,/CYBK,/g +s/^71934,/CYSM,/g +s/^71945,/CYYE,/g +s/^71957,/CYEV,/g +s/^71964,/CYXY,/g +s/^72201,/KKEY,/g +s/^72202,/KMFL,/g +s/^72206,/KJAX,/g +s/^72208,/KCHS,/g +s/^72210,/KTBW,/g +s/^72214,/KTAE,/g +s/^72215,/KFFC,/g +s/^72221,/KVPS,/g +s/^72230,/KBMX,/g +s/^72233,/KLIX,/g +s/^72235,/KJAN,/g +s/^72240,/KLCH,/g +s/^72248,/KSHV,/g +s/^72249,/KFWD,/g +s/^72250,/KBRO,/g +s/^72251,/KCRP,/g +s/^72257,/KHLR,/g +s/^72261,/KDRT,/g +s/^72265,/KMAF,/g +s/^72269,/KWSD,/g +s/^72274,/KTWC,/g +s/^72280,/KYUM,/g +s/^72291,/KNSI,/g +s/^72293,/KNKX,/g +s/^72305,/KMHX,/g +s/^72317,/KGSO,/g +s/^72318,/KRNK,/g +s/^72327,/KOHX,/g +s/^72340,/KLZK,/g +s/^72357,/KOUN,/g +s/^72363,/KAMA,/g +s/^72364,/KEPZ,/g +s/^72365,/KABQ,/g +s/^72376,/KFGZ,/g +s/^72381,/KEDW,/g +s/^72386,/KLAS,/g +s/^72387,/KDRA,/g +s/^72391,/KNTD,/g +s/^72393,/KVBG,/g +s/^72402,/KWAL,/g +s/^72403,/KLWX,/g +s/^72426,/KILN,/g +s/^72440,/KSGF,/g +s/^72451,/KDDC,/g +s/^72456,/KTOP,/g +s/^72469,/KDNR,/g +s/^72476,/KGJT,/g +s/^72489,/KREV,/g +s/^72493,/KOAK,/g +s/^72501,/KOKX,/g +s/^72518,/KALY,/g +s/^72520,/KPBZ,/g +s/^72528,/KBUF,/g +s/^72558,/KOAX,/g +s/^72562,/KLBF,/g +s/^72572,/KSLC,/g +s/^72582,/KLKN,/g +s/^72597,/KMFR,/g +s/^72632,/KDTX,/g +s/^72634,/KAPX,/g +s/^72645,/KGRB,/g +s/^72649,/KMPX,/g +s/^72659,/KABR,/g +s/^72662,/KUNR,/g +s/^72672,/KRIW,/g +s/^72681,/KBOI,/g +s/^72694,/KSLE,/g +s/^72712,/KCAR,/g +s/^72747,/KINL,/g +s/^72764,/KBIS,/g +s/^72768,/KGGW,/g +s/^72776,/KTFX,/g +s/^72786,/KOTX,/g +s/^72797,/KUIL,/g +s/^74002,/KAPG,/g +s/^74004,/K1Y7,/g +s/^74005,/K1Y8,/g +s/^74006,/K1Y9,/g +s/^74389,/KGYX,/g +s/^74455,/KDVN,/g +s/^74494,/KCHH,/g +s/^74560,/KILX,/g +s/^74626,/KPSR,/g +s/^74794,/KXMR,/g +s/^76151,/MILS,/g +s/^76225,/MMCU,/g +s/^76256,/MMGM,/g +s/^76342,/MMOV,/g +s/^76361,/MLMM,/g +s/^76382,/MTRC,/g +s/^76394,/MMMY,/g +s/^76405,/MLAP,/g +s/^76458,/MMMZ,/g +s/^76491,/MCVM,/g +s/^76499,/MSOT,/g +s/^76548,/MTAM,/g +s/^76612,/MMGL,/g +s/^76644,/MMMD,/g +s/^76649,/MCZM,/g +s/^76654,/MMZO,/g +s/^76665,/MMOR,/g +s/^76679,/MMMX,/g +s/^76680,/MMDF,/g +s/^76692,/MMVR,/g +s/^76723,/MISC,/g +s/^76749,/MCME,/g +s/^76805,/MACA,/g +s/^76830,/MIZT,/g +s/^76840,/MARR,/g +s/^76904,/MTAP,/g +s/^78016,/TXKF,/g +s/^78073,/MYNN,/g +s/^78367,/MUGM,/g +s/^78384,/MKCG,/g +s/^78397,/MKJP,/g +s/^78486,/MDSD,/g +s/^78526,/TJSJ,/g +s/^78583,/MZBZ,/g +s/^78806,/MPHO,/g +s/^78808,/MABK,/g +s/^78866,/MACM,/g +s/^78897,/TFFR,/g +s/^78954,/MKPB,/g +s/^78970,/MKPP,/g +s/^78988,/MACC,/g +s/^80001,/MCSP,/g +s/^80035,/SKRH,/g +s/^81405,/SOCA,/g +s/^91066,/PMDY,/g +s/^91165,/PHLI,/g +s/^91212,/PGUM,/g +s/^91217,/PGAC,/g +s/^91218,/PGUA,/g +s/^91245,/PWAK,/g +s/^91250,/PKMA,/g +s/^91275,/PJON,/g +s/^91285,/PHTO,/g +s/^91334,/PTKK,/g +s/^91348,/PTPN,/g +s/^91366,/PKWA,/g +s/^91376,/PMKJ,/g +s/^91408,/PTRO,/g +s/^91413,/PTYA,/g +s/^91517,/AGGH,/g +s/^91558,/NHHH,/g +s/^91592,/NWWN,/g +s/^91610,/NGTA,/g +s/^91643,/NGFU,/g +s/^91680,/NFFN,/g +s/^91700,/PCIS,/g +s/^91765,/NSTU,/g +s/^91843,/NCRG,/g +s/^91925,/NTMN,/g +s/^91938,/NTTT,/g +s/^91944,/NTTO,/g +s/^93997,/NZRN,/g +s/^94027,/AYLA,/g +s/^94035,/AYPY,/g +s/^94120,/YPDN,/g +s/^94203,/YPBR,/g +s/^94212,/AHHC,/g +s/^94238,/YDTC,/g +s/^94287,/YBCS,/g +s/^94294,/YBTL,/g +s/^94326,/YBAS,/g +s/^94332,/YBMA,/g +s/^94346,/YBLR,/g +s/^94367,/YBMK,/g +s/^94380,/YBGL,/g +s/^94510,/YBCV,/g +s/^94578,/YBBN,/g +s/^94637,/YPKG,/g +s/^94646,/YPFT,/g +s/^94653,/YPCD,/g +s/^94659,/YPWR,/g +s/^94672,/YPAD,/g +s/^94693,/YMMI,/g +s/^94750,/YSNW,/g +s/^94767,/YSSY,/g +s/^94776,/YSWM,/g +s/^94791,/YSCH,/g +s/^94995,/ASLH,/g +s/^94996,/YSNF,/g +s/^98327,/RPMK,/g diff --git a/data/grid/a2invmdlStub.py b/data/grid/a2invmdlStub.py new file mode 100644 index 0000000..b56d679 --- /dev/null +++ b/data/grid/a2invmdlStub.py @@ -0,0 +1,124 @@ +## +# 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. +## + +# Gets inventories of gridded data from the A-II database. The data is output +# to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-22 3599 nabowle Initial modification. Convert to DAF. +# 2014-11-17 3599 nabowle Fix call to get_args(). +# + +import argparse +import numpy +import sys + +from ufpy.dataaccess import DataAccessLayer + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", metavar="hostname") + parser.add_argument("--srcId", action="store", dest="srcId", + help="Unique alphanumeric name for gridded data source", + metavar="srcId") + parser.add_argument("--varAbrev", action="store", dest="varAbrev", + help="Variable abreviation", metavar="varAbrev") + parser.add_argument("--lvlOne", action="store", dest="lvlOne", + help="Level One value", metavar="lvlOne", type=float) + parser.add_argument("--lvlTwo", action="store", dest="lvlTwo", + help="Level Two value", metavar="lvlTwo", type=float) + parser.add_argument("--lvlName", action="store", dest="lvlName", + help="Master level name", metavar="lvlName") + parser.add_argument("--mode", action="store", dest="mode", default="time", + help="Mode - time, plane, field, or fieldplane") + return parser.parse_args() + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + req = DataAccessLayer.newDataRequest("grid") + + if not user_args.srcId: + print >> sys.stderr, "srcId not provided" + return + req.addIdentifier("info.datasetId", user_args.srcId) + + if user_args.varAbrev: + req.setParameters(user_args.varAbrev) + if user_args.lvlName is not None: + req.addIdentifier("info.level.masterLevel.name", user_args.lvlName) + if user_args.lvlOne is not None: + req.addIdentifier("info.level.levelonevalue", numpy.float64(user_args.lvlOne)) + if user_args.lvlTwo is not None: + req.addIdentifier("info.level.leveltwovalue", numpy.float64(user_args.lvlTwo)) + + mode = user_args.mode + if mode not in ["time", "plane", "field", "fieldplane"]: + print >> sys.stderr, "mode must be one of time, plane, field, or fieldplane." + return + + msg = ""; + if mode == "time": + times = DataAccessLayer.getAvailableTimes(req) + for time in times: + timeStr = str(time) + if "--" in timeStr: + timeStr = timeStr[0:-22] + ".0" + timeStr[-22:-1] + ".0" + timeStr[-1] + msg += timeStr[0:19] + ".0" + timeStr[19:] + "\n" + elif mode == "plane": + levels = DataAccessLayer.getAvailableLevels(req) + for level in levels: + msg += level_to_string(level) + "\n" + elif mode == "field": + params = DataAccessLayer.getAvailableParameters(req) + msg = "\n".join(params) + else: #fieldplane + params = DataAccessLayer.getAvailableParameters(req) + for param in params: + msg += param + ":\n" + req.setParameters(param) + levels = DataAccessLayer.getAvailableLevels(req) + if levels: + levelStr = [] + for level in levels: + levelStr.append(level_to_string(level)) + msg += " ".join(levelStr) + " \n" + + print msg.strip("\n") + + +def level_to_string(level): + name = level.getMasterLevel().getName() + lvlOne = str(level.getLevelonevalue()) + lvlTwo = str(level.getLeveltwovalue()) + msg = name + " " + lvlOne + if lvlTwo not in ["None", "-999999.0"]: + msg += " " + lvlTwo + return msg + +if __name__ == '__main__': + main() diff --git a/data/grid/a2rdmdlCommon.py b/data/grid/a2rdmdlCommon.py new file mode 100644 index 0000000..2566db9 --- /dev/null +++ b/data/grid/a2rdmdlCommon.py @@ -0,0 +1,142 @@ +## +# 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. +## + +# Gets all available raob data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-15 3598 nabowle Initial creation. Extracted common code from a2rdmdl*.py +# 2014-12-15 3598 nabowle Fix retrieval when fcst is 0. +# + +import argparse +import numpy + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import DataTime +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_parser(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", metavar="hostname") + parser.add_argument("--date", action="store", dest="date", + help="The date in YYYY-MM-DD", metavar="date") + parser.add_argument("--hour", action="store", dest="hour", + help="The hour in HH", metavar="hour") + parser.add_argument("--fcst", action="store", dest="fcst", + help="The forecast time in hours", metavar="fcst") + parser.add_argument("--srcId", action="store", dest="srcId", + help="Unique alphanumeric name for gridded data source", + metavar="srcId") + parser.add_argument("--varAbrev", action="store", dest="varAbrev", + help="Variable abreviation", metavar="varAbrev") + parser.add_argument("--lvlOne", action="store", dest="lvlOne", + help="Level One value", metavar="lvlOne", type=float) + parser.add_argument("--lvlTwo", action="store", dest="lvlTwo", + help="Level Two value", metavar="lvlTwo", type=float) + parser.add_argument("--lvlName", action="store", dest="lvlName", + help="Master level name", metavar="lvlName") + return parser + +def do_request(user_args): + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + srcId = user_args.srcId + varAbrev = user_args.varAbrev + + if not srcId or not varAbrev: + raise Exception("srcId or varAbrev not provided") + return + + date = user_args.date + hour = user_args.hour + fcst = user_args.fcst + + if not date or not hour or not fcst: + raise Exception("date, hour, or fcst not provided") + return + + dt = datetime.strptime( str(date) + " " + str(hour) + ":00:00.0", "%Y-%m-%d %H:%M:%S.%f") + +# check for and build date range if necessary + daterange = None + if varAbrev.endswith("hr"): + import re + matches = re.findall(r'\d+', varAbrev) + if matches: + from datetime import timedelta + hourRange = int(matches[-1]) + endDate = dt + timedelta(hours=int(fcst)) + beginDate = endDate - timedelta(hours=hourRange) + daterange = TimeRange(beginDate, endDate) + +# convert hours to seconds because DataTime does the reverse + time = DataTime(dt, int(fcst)*3600, daterange) + + + req = DataAccessLayer.newDataRequest("grid") + req.setParameters(varAbrev) + req.addIdentifier("info.datasetId", srcId) + +# To handle partial level matches, use identifiers instead of a Level. + if user_args.lvlName is not None: + req.addIdentifier("info.level.masterLevel.name", user_args.lvlName) + if user_args.lvlOne is not None: + req.addIdentifier("info.level.levelonevalue", numpy.float64(user_args.lvlOne)) + if user_args.lvlTwo is not None: + req.addIdentifier("info.level.leveltwovalue", numpy.float64(user_args.lvlTwo)) + + times = [time] + +# If fcst is 0, also query for times with FCST_USED flag + if fcst == '0': + time = DataTime(dt, int(fcst)*3600, daterange) + time.utilityFlags.add("FCST_USED") + times.append(time) + + grids = DataAccessLayer.getGridData(req, times) + + if not grids: +# print "Data not available" + raise Exception("") + + grid = grids[0] + rawData = grid.getRawData() + + yLen = len(rawData[0]) + xLen = len(rawData) + + return grid, xLen, yLen + +def get_indices(j, rowLen): +# the lengths are reversed from how getRawData() returns the data and forces +# the need to calculate the dataIdx and arrIdx instead of +# for row in reversed(rawData): for k in row: ... +# it's important to check that arrIdx < len(arr) when arrIdx is incremented + dataIdx = int(j / rowLen) # index into rawData + arrIdx = j % rowLen # index into rawData[dataIdx] + return dataIdx, arrIdx + diff --git a/data/grid/a2rdmdlStub.py b/data/grid/a2rdmdlStub.py new file mode 100644 index 0000000..59b2c9d --- /dev/null +++ b/data/grid/a2rdmdlStub.py @@ -0,0 +1,167 @@ +## +# 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. +## + +# Gets all available raob data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-14 3598 nabowle Initial modification. Changed to use DataAccessLayer. +# + +import a2rdmdlCommon +import argparse +import numpy +import sys + +def get_args(): + parser = a2rdmdlCommon.get_parser() + parser.add_argument("--dimLine", action="store_true", dest="dimLine", + help="Output dimensions", default=False) + return parser.parse_args() + +def main(): + user_args = get_args() + + try: + grid, xLen, yLen = a2rdmdlCommon.do_request(user_args) + except Exception as e: + print >> sys.stderr, str(e) + return + + rawData = grid.getRawData() + + msg = "" + if user_args.dimLine: + msg += str(xLen) + " " + str(yLen) + "\n" + + nxy = yLen*xLen + j = nxy-xLen + while j>=0 : + dataIdx, arrIdx = a2rdmdlCommon.get_indices(j, yLen) + arr = rawData[dataIdx] + i = 0 + while i= yLen: + arrIdx = 0 + dataIdx += 1 + arr = rawData[dataIdx] + + k = arr[arrIdx] + if numpy.isnan(k) : + k = 0 + if k<0 : + a = -k + else : + a = k + if a>=999998 : + msg += "1e37 " + elif a<0.00005 : + msg += "%g"%k + " " + elif a<0.0009 : + if round(k,8) == round(k,4) : + msg += "%.4f"%k + " " + elif round(k,8) == round(k,5) : + msg += "%.5f"%k + " " + elif round(k,8) == round(k,6) : + msg += "%.6f"%k + " " + elif round(k,8) == round(k,7) : + msg += "%.7f"%k + " " + else : + msg += "%.8f"%k + " " + elif a<0.009 : + if round(k,7) == round(k,3) : + msg += "%.3f"%k + " " + elif round(k,7) == round(k,4) : + msg += "%.4f"%k + " " + elif round(k,7) == round(k,5) : + msg += "%.5f"%k + " " + elif round(k,7) == round(k,6) : + msg += "%.6f"%k + " " + else : + msg += "%.7f"%k + " " + elif a<0.09 : + if round(k,6) == round(k,2) : + msg += "%.2f"%k + " " + elif round(k,6) == round(k,3) : + msg += "%.3f"%k + " " + elif round(k,6) == round(k,4) : + msg += "%.4f"%k + " " + elif round(k,6) == round(k,5) : + msg += "%.5f"%k + " " + else : + msg += "%.6f"%k + " " + elif a<0.9 : + if round(k,5) == round(k,1) : + msg += "%.1f"%k + " " + elif round(k,5) == round(k,2) : + msg += "%.2f"%k + " " + elif round(k,5) == round(k,3) : + msg += "%.3f"%k + " " + elif round(k,5) == round(k,4) : + msg += "%.4f"%k + " " + else : + msg += "%.5f"%k + " " + elif a<9 : + if round(k,4) == round(k,0) : + msg += "%.0f"%k + " " + elif round(k,4) == round(k,1) : + msg += "%.1f"%k + " " + elif round(k,4) == round(k,2) : + msg += "%.2f"%k + " " + elif round(k,4) == round(k,3) : + msg += "%.3f"%k + " " + else : + msg += "%.4f"%k + " " + elif a<99 : + if round(k,3) == round(k,0) : + msg += "%.0f"%k + " " + elif round(k,3) == round(k,1) : + msg += "%.1f"%k + " " + elif round(k,3) == round(k,2) : + msg += "%.2f"%k + " " + else : + msg += "%.3f"%k + " " + elif a<999 : + if round(k,2) == round(k,0) : + msg += "%.0f"%k + " " + elif round(k,2) == round(k,1) : + msg += "%.1f"%k + " " + else : + msg += "%.2f"%k + " " + elif a<9999 : + if round(k,1) == round(k,0) : + msg += "%.0f"%k + " " + else : + msg += "%.1f"%k + " " + else : + msg += "%.0f"%k + " " + i += 1 + arrIdx += 1 + + msg += "\n" + j -= xLen + + print msg.strip() + " " + +if __name__ == '__main__': + main() diff --git a/data/grid/a2rdmdlXdr.py b/data/grid/a2rdmdlXdr.py new file mode 100644 index 0000000..eb2ac35 --- /dev/null +++ b/data/grid/a2rdmdlXdr.py @@ -0,0 +1,91 @@ +## +# 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. +## + +# Gets all available raob data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-15 3598 nabowle Initial modification. Changed to use DataAccessLayer. +# + +import a2rdmdlCommon +import argparse +import numpy +import xdrlib +import bz2 +import sys + +def get_args(): + return a2rdmdlCommon.get_parser().parse_args() + +def main(): + user_args = get_args() + + try: + grid, xLen, yLen = a2rdmdlCommon.do_request(user_args) + except Exception as e: + print >> sys.stderr, str(e) + return + + rawData = grid.getRawData() + + msg = str(xLen) + " " + str(yLen) + "\n" + + nxy = yLen*xLen + j = nxy-xLen + mypacker = xdrlib.Packer() + mypacker.reset() + while j>=0 : + dataIdx, arrIdx = a2rdmdlCommon.get_indices(j, yLen) + arr = rawData[dataIdx] + i = 0 + while i= yLen: + arrIdx = 0 + dataIdx += 1 + arr = rawData[dataIdx] + + k = arr[arrIdx] + if numpy.isnan(k) : + k = 0 + + mypacker.pack_float(float(k)) + i += 1 + arrIdx += 1 + + j -= xLen + + packLen = len(mypacker.get_buffer()) + xdrbuf = bz2.compress(mypacker.get_buffer()) + cmpLen = len(xdrbuf) + msg += str(packLen)+" "+str(cmpLen*2)+"\t\n" + i = 0 + while i tag in the associated +# entry, the ggid must be supplied as a quoted empty string. +# +# With no arguments after the grid number, returns a list of variables for +# the data source specified by the process and grid id. With only a variable, +# returns information for the list of planes for that variable. With more +# arguments, returns a list of times for that variable and plane. +# +# Level value arguments are meaningless without the level type argument, +# but it is meaningful to provide only a level type. +# +# If the only argument after the process and grid is a literal at sign ('@') +# then what is returned is a list of all times for which there is data +# available for the given process/grid combination. +# +# If the only argument after the process and grid is a literal plus sign (+), +# then what will be returned will be a level inventory for all variables. +# +# The literal p option means preserve the final version of the python +# submitted to the UEngine instead of cleaning it up. The path to the +# finalized python is /tmp/a2rdmdlNNNNN.py where NNNNN is a unix process id. +# +# Gets all available raob data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-22 3599 nabowle Initial modification. Changed to properly call DAF version. +# +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( -x $mydir/$0 ) then + set me = $mydir/$0 +else + set me = $0 +endif +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +# Primarily base stuff on source name, but try to use the old interface. +# +set sss = "$1" +shift +set ids = `echo $sss | tr ',' ' '` +echo "$ids[1]" | grep '^[0-9][0-9]*$' >& /dev/null +if ( $status == 0 || $#ids > 1 ) then + set mroot = /awips2/edex/data/utility/edex_static/base/grib/models + set ids = `echo $ids | tr ' ' '\n' | grep -v '^ *$' | \ + sed 's#^##g' | sed 's#$#<|#g'` + set ids = `echo ${ids}quertyuiop | sed 's/ *//g'` + set ggg = "$1" + shift + if ( "$ggg" == "" ) then + set mmm = `find $mroot -name '*xml' ! -name '*ECMWF*' \ + -exec cat '{}' \; | sed 's|-->|~|g' | \ + tr '\t' ' ' | sed 's/ *//g' | sed 's||~|g' | \ + tr '\n' ' ' | tr '~' '\n' | grep -E "$ids" | \ + grep -v "" | sed 's/^.*//g' | \ + cut '-d<' -f1 | sort -u` + else + set mmm = `find $mroot -name '*xml' -exec cat '{}' \; | \ + sed 's|-->|~|g' | \ + tr '\t' ' ' | sed 's/ *//g' | sed 's||~|g' | \ + tr '\n' ' ' | tr '~' '\n' | grep -E "$ids" | \ + grep "$ggg<" | sed 's/^.*//g' | \ + cut '-d<' -f1 | sort -u` + endif + if ( $#mmm != 1 ) then + echo "$mmm" + echo "Could not look up model name based on $sss '$ggg'" + exit 1 + endif + set sss = $mmm +endif + +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./a2invmdlStub.py ) then + set stubpy = ./a2invmdlStub.py +else if ( -e $mydir/a2invmdlStub.py ) then + set stubpy = $mydir/a2invmdlStub.py +else if ( -e $FXA_HOME/src/dm/grid/a2invmdlStub.py ) then + set stubpy = $FXA_HOME/src/dm/grid/a2invmdlStub.py +else if ( -e $FXA_HOME/bin/a2invmdlStub.py ) then + set stubpy = $FXA_HOME/bin/a2invmdlStub.py +else + bash -c "echo could not find a2invmdlStub.py 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + if ( "$*" == "+" ) then + python $stubpy --mode fieldplane --srcId $sss + else if ( "$1" == "" ) then + python $stubpy --mode field --srcId $sss + else if ( "$1" == "@" ) then + python $stubpy --mode time --srcId $sss + else if ( "$2" == "" ) then + python $stubpy --mode plane --srcId $sss --varAbrev $1 + else if ( "$3" == "" ) then + python $stubpy --mode time --srcId $sss --lvlName $1 --varAbrev $2 + else if ( "$4" == "" ) then + python $stubpy --mode time --srcId $sss --lvlName $1 --lvlOne $2 --varAbrev $3 + else + python $stubpy --mode time --srcId $sss --lvlName $1 --lvlOne $2 --lvlTwo $3 --varAbrev $4 + endif +else + # + if ( "$*" == "+" ) then + set varList = `$me $sss` + foreach onevar ( $varList ) + echo ${onevar}: + $me $sss $onevar | tr '\n' ' ' + echo + end + exit + endif + + # + # Set up the environment we need to run the UEngine. + # + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + # + # Modify the text of special tags in stub to create finalized script. + # + set specpy = /tmp/a2invmdl${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + set plane = no + if ( "$1" == "" ) then + cat $stubpy | sed "s/MMMMM/field/g" | sed "s/SSSSS/$sss/g" | \ + sed 's/^.*TTTTT.*$//g' | sed 's/^.*LLLLL.*$//g' | \ + sed 's/^.*22222.*$//g' | sed 's/^.*VVVVV.*$//g' >> $specpy + else if ( "$1" == "@" ) then + cat $stubpy | sed "s/MMMMM/time/g" | sed "s/SSSSS/$sss/g" | \ + sed 's/^.*TTTTT.*$//g' | sed 's/^.*LLLLL.*$//g' | \ + sed 's/^.*22222.*$//g' | sed 's/^.*VVVVV.*$//g' >> $specpy + else if ( "$2" == "" ) then + set plane = yes + cat $stubpy | sed "s/MMMMM/plane/g" | sed "s/SSSSS/$sss/g" | \ + sed 's/^.*TTTTT.*$//g' | sed 's/^.*LLLLL.*$//g' | \ + sed 's/^.*22222.*$//g' | sed "s/VVVVV/$1/g" >> $specpy + else if ( "$3" == "" ) then + cat $stubpy | sed "s/MMMMM/time/g" | sed "s/SSSSS/$sss/g" | \ + sed "s/TTTTT/$1/g" | sed 's/^.*LLLLL.*$//g' | \ + sed 's/^.*22222.*$//g' | sed "s/VVVVV/$2/g" >> $specpy + else if ( "$4" == "" ) then + cat $stubpy | sed "s/MMMMM/time/g" | sed "s/SSSSS/$sss/g" | \ + sed "s/TTTTT/$1/g" | sed "s/LLLLL/$2/g"| \ + sed 's/^.*22222.*$//g' | sed "s/VVVVV/$3/g" >> $specpy + else + cat $stubpy | sed "s/MMMMM/time/g" | sed "s/SSSSS/$sss/g" | \ + sed "s/TTTTT/$1/g" | sed "s/LLLLL/$2/g" | \ + sed "s/22222/$3/g" | sed "s/VVVVV/$4/g" >> $specpy + endif + if ( "$plane" == "no" ) then + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) |& grep attributes | cut '-d"' -f4 + else + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) |& sed 's|.*.*|@|g' | \ + grep -E 'attributes|@' | cut '-d"' -f4 | tr '\n' ' ' | tr '@' '\n' | \ + sed 's/ -999999.0//g' | sed 's/^ *//g' | sed 's/ *$//g' + endif + #if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null + # +endif + diff --git a/data/grid/gridRead.csh b/data/grid/gridRead.csh new file mode 100755 index 0000000..34b79a1 --- /dev/null +++ b/data/grid/gridRead.csh @@ -0,0 +1,305 @@ +#!/bin/csh -f +## +# 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. +## + +# Gets all available raob data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-16 3598 nabowle Initial modification. Changed to handle DataAccessLayer. +# +# +# A script wrapper that is meant to get a single slab of gridded data +# from the A-II database. The data is output to stdout as ASCII. +# This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2rdmdl.csh p n x srcid ctyp lval1 lval2 varAbrev date hour fcst +# +# p - A literal p. (optional) +# n - A literal n. (optional) +# x - A literal x. (optional) +# srcid - Unique alphanumeric name for gridded data source. +# ctyp - Level type id (optional) +# lval1 - First level value (optional) +# lval2 - Second level value (optional) +# varAbrev - Variable abreviation. +# date - Date of model run time as yyyy-mm-dd +# hour - Hour of model run time as hh +# fcst - Forecast time in hours +# +# Legacy usage, not supported in all cases: +# +# a2rdmdl.csh p n x gproc ggid ctyp lval1 lval2 varAbrev date hour fcst +# +# p - A literal p. (optional) +# n - A literal n. (optional) +# x - A literal x. (optional) +# gproc - GRIB process number (can be multiple comma delimited) +# ggid - GRIB grid number +# ctyp - Level type id (optional) +# lval1 - First level value (optional) +# lval2 - Second level value (optional) +# varAbrev - Variable abreviation. +# date - Date of model run time as yyyy-mm-dd +# hour - Hour of model run time as hh +# fcst - Forecast time in hours +# +# With the new unified GRIB decoder, instead of gproc ggid, it is best +# to supply the srcid, which is like ETA or GFS254; e.g. the directory +# under /awips2/edex/data/hdf5/grid where the data is stored. +# +# Note that now for sources with no tag in the associated +# entry, the ggid must be supplied as a quoted empty string. +# +# The literal p option means preserve the final version of the python +# submitted to the UEngine instead of cleaning it up. The path to the +# finalized python is /tmp/a2rdmdlNNNNN.py where NNNNN is a unix process id. +# The literal n option means the first line of output is the dimension of +# the grid returned. The literal x option means return the data in xdr +# format; in this case the xdr data begins immediately after a tab-linefeed. +# +# Process any one character options. +# +set rmpy = yes +set dimStr = dimStr +set specpyName = a2rdmdlStub +while (1) + if ( "$1" == "p" ) then + set rmpy = no + else if ( "$1" == "n" ) then + set dimStr = qwertyuiop + else if ( "$1" == "x" ) then + set specpyName = a2rdmdlXdr + set dimStr = qwertyuiopx + else + break + endif + shift +end +# +# Identify directory this script is in, will be one of the directories we +# search for other files we need. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +# Special case of topo, we will hard code it. +# +echo " $* " | grep " Topo " >& /dev/null +if ( $status == 0 ) then + set outfile = `find . -maxdepth 1 \ + -name "$1.Topo" -o -name "$1.$2.Topo" -o -name "*,$1.$2.Topo" -o \ + -name "$1,*.$2.Topo" -o -name "*,$1,*.$2.Topo"` >& /dev/null + if ( ( $#outfile != 1 ) && ( $mydir != $PWD ) ) then + set outfile = `find $mydir -maxdepth 1 \ + -name "$1.Topo" -o -name "$1.$2.Topo" -o -name "*,$1.$2.Topo" -o \ + -name "$1,*.$2.Topo" -o -name "*,$1,*.$2.Topo"` >& /dev/null + endif + if ( ( $#outfile != 1 ) && ( -d $FXA_HOME/data ) ) then + set outfile = `find $FXA_HOME/data -maxdepth 1 \ + -name "$1.Topo" -o -name "$1.$2.Topo" -o -name "*,$1.$2.Topo" -o \ + -name "$1,*.$2.Topo" -o -name "*,$1,*.$2.Topo"` >& /dev/null + endif + if ( $#outfile != 1 ) then + bash -c "echo No flat file available with topo for $1 $2 1>&2" + exit + endif + if ( "$dimStr" == "qwertyuiop" ) then + set nnn = `cat $outfile | wc` + set ny = $nnn[1] + @ nx = $nnn[2] / $ny + echo $nx $ny + endif + cat $outfile + exit +endif +# +# Primarily base stuff on source name, but try to use the old interface. +# +set sss = "$1" +shift +set ids = `echo $sss | tr ',' ' '` +echo "$ids[1]" | grep '^[0-9][0-9]*$' >& /dev/null +if ( $status == 0 || $#ids > 1 ) then + set mroot = /awips2/edex/data/utility/edex_static/base/grib/models + set ids = `echo $ids | tr ' ' '\n' | grep -v '^ *$' | \ + sed 's#^##g' | sed 's#$#<|#g'` + set ids = `echo ${ids}quertyuiop | sed 's/ *//g'` + set ggg = "$1" + shift + if ( "$ggg" == "" ) then + set mmm = `find $mroot -name '*xml' ! -name '*ECMWF*' \ + -exec cat '{}' \; | sed 's|-->|~|g' | \ + tr '\t' ' ' | sed 's/ *//g' | sed 's||~|g' | \ + tr '\n' ' ' | tr '~' '\n' | grep -E "$ids" | \ + grep -v "" | sed 's/^.*//g' | \ + cut '-d<' -f1 | sort -u` + else + set mmm = `find $mroot -name '*xml' -exec cat '{}' \; | \ + sed 's|-->|~|g' | \ + tr '\t' ' ' | sed 's/ *//g' | sed 's||~|g' | \ + tr '\n' ' ' | tr '~' '\n' | grep -E "$ids" | \ + grep "$ggg<" | sed 's/^.*//g' | \ + cut '-d<' -f1 | sort -u` + endif + if ( $#mmm != 1 ) then + echo "$mmm" + echo "Could not look up model name based on $sss '$ggg'" + exit 1 + endif + set sss = $mmm +endif + +@ i = $#argv - 3 +set vvvvv = $argv[$i] + +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./${specpyName}.py ) then + set stubpy = ./${specpyName}.py +else if ( -e $mydir/${specpyName}.py ) then + set stubpy = $mydir/${specpyName}.py +else if ( -e $FXA_HOME/src/dm/grid/${specpyName}.py ) then + set stubpy = $FXA_HOME/src/dm/grid/${specpyName}.py +else if ( -e $FXA_HOME/bin/${specpyName}.py ) then + set stubpy = $FXA_HOME/bin/${specpyName}.py +else + bash -c "echo could not find ${specpyName}.py 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set userArgs = "--srcId $sss --varAbrev $vvvvv" + if ( ( "$dimStr" != "dimStr" ) && ( "$specpyName" != "a2rdmdlXdr" ) ) then + set userArgs = "$userArgs --dimLine" + endif + + if ( "$5" == "" ) then + set userArgs = "$userArgs --date $2 --hour $3 --fcst $4" + else if ( "$6" == "" ) then + set userArgs = "$userArgs --lvlName $1 --date $3 --hour $4 --fcst $5" + else if ( "$7" == "" ) then + set userArgs = "$userArgs --lvlName $1 --lvlOne $2 --date $4 --hour $5 --fcst $6" + else + set userArgs = "$userArgs --lvlName $1 --lvlOne $2 --lvlTwo $3 --date $5 --hour $6 --fcst $7" + endif + python $stubpy $userArgs +else + # + # Set up the environment we need to run the UEngine. + # + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set rrrrr = "" + set aaa = `echo $vvvvv | grep -E '^CP|^TP|^LgSP' | tr 'A-z' ' '` + set aaa = `echo $aaa` + # + # Special case of formatting the times for accumulated precip + # + if ( "$aaa" != "" ) then + if ( -x ./gtasUtil ) then + set gtasUtil = ./gtasUtil + else if ( -x $mydir/gtasUtil ) then + set gtasUtil = $mydir/gtasUtil + else if ( -x $FXA_HOME/src/dm/point/gtasUtil ) then + set gtasUtil = $FXA_HOME/src/dm/point/gtasUtil + else if ( -x $FXA_HOME/bin/gtasUtil ) then + set gtasUtil = $FXA_HOME/bin/gtasUtil + else + bash -c "echo could not find gtasUtil executable 1>&2" + exit + endif + @ i++ + set t = `echo $* | cut '-d ' -f${i}-$#argv` + @ fff = $t[3] * 3600 + set vt = `$gtasUtil = $t[1] ${t[2]}:00:00.0 $fff` + @ aaa = $aaa * 3600 + set bt = `$gtasUtil = $vt -$aaa` + set rrrrr = "[$bt--$vt]" + endif + + # + # Modify the text of special tags in stub to create finalized script. + # + set specpy = /tmp/a2rdmdl${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + if ( "$5" == "" ) then + cat $stubpy | grep -v $dimStr | sed "s/SSSSS/$sss/g" | \ + sed 's/^.*TTTTT.*$//g' | sed 's/^.*LLLLL.*$//g' | \ + sed 's/^.*22222.*$//g' | sed "s/VVVVV/$1/g" | sed "s/DDDDD/$2/g" | \ + sed "s/HHHHH/$3/g" | sed "s/FFFFF/$4/g" | sed "s/RRRRR/$rrrrr/g" >> \ + $specpy + else if ( "$6" == "" ) then + cat $stubpy | grep -v $dimStr | sed "s/SSSSS/$sss/g" | \ + sed "s/TTTTT/$1/g" | sed 's/^.*LLLLL.*$//g' | sed 's/^.*22222.*$//g' | \ + sed "s/VVVVV/$2/g" | sed "s/DDDDD/$3/g" | \ + sed "s/HHHHH/$4/g" | sed "s/FFFFF/$5/g" | sed "s/RRRRR/$rrrrr/g" >> \ + $specpy + else if ( "$7" == "" ) then + cat $stubpy | grep -v $dimStr | sed "s/SSSSS/$sss/g" | \ + sed "s/TTTTT/$1/g" | sed "s/LLLLL/$2/g" | sed 's/^.*22222.*$//g' | \ + sed "s/VVVVV/$3/g" | sed "s/DDDDD/$4/g" | \ + sed "s/HHHHH/$5/g" | sed "s/FFFFF/$6/g" | sed "s/RRRRR/$rrrrr/g" >> \ + $specpy + else + cat $stubpy | grep -v $dimStr | sed "s/SSSSS/$sss/g" | \ + sed "s/TTTTT/$1/g" | sed "s/LLLLL/$2/g" | sed "s/22222/$3/g" | \ + sed "s/VVVVV/$4/g" | sed "s/DDDDD/$5/g" | \ + sed "s/HHHHH/$6/g" | sed "s/FFFFF/$7/g" | sed "s/RRRRR/$rrrrr/g" >> \ + $specpy + endif + # + # Submit the temporary python script stripping any xml stuff, then remove it + # + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | grep -v Response + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif diff --git a/data/maritime/a2cvboyStub.py b/data/maritime/a2cvboyStub.py new file mode 100644 index 0000000..8f42369 --- /dev/null +++ b/data/maritime/a2cvboyStub.py @@ -0,0 +1,160 @@ +## +# 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. +## + +# Gets all available Laps maritime data in the A-II database over a specified +# range of times. The data is output to stdout as ASCII. Each line is one +# time/platform combination. The individual data items are comma delimited. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/18/2014 3591 nabowle Initial modification. Replace UEngine with DAF. +# +# + +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + return parser.parse_args() + + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("sfcobs") + req.setParameters("stationId","timeObs","elevation","reportType", + "wx_present","visibility","seaLevelPress","stationPress", + "pressChange3Hour","pressChangeChar","temperature", + "dewpoint","seaSurfaceTemp","wetBulb","windDir", + "windSpeed","equivWindSpeed10m","windGust","precip1Hour", + "precip6Hour","precip24Hour" ) + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "No data available." + return + + # Initialize conversion array for wx. + wxstr = [ " ", " ", " ", " ", "FU", "HZ", "DU", "BLSA", "PO", "VCSS", \ + "BR", "BCFG", "MIFG", "VCTS", "VCSH", "VCSH", "VCSH", " ", "SQ", "+FC", \ + "DZ", "RA", "SN", "RA SN", "FZRA", "SHRA", "SHRA SHSN", "SHGR", "FG FZFG", "TS", \ + "SS", "SS", "SS", "+SS", "+SS", "+SS", "DRSN", " ", "BLSN", "+BLSN", \ + "VCFG", "BCFG", "FG FZFG", "FG FZFG", "FG FZFG", "FG FZFG", "FG FZFG", "FG FZFG", "FZFG", "FZFG", \ + "-DZ", "-DZ", "DZ", "DZ", "+DZ", "+DZ", "-FZDZ", "FZDZ", "-DZ -RA", "DZ RA", \ + "-RA", "-RA", "RA", "RA", "+RA", "+RA", "-FZRA", "FZRA", "-RA -SN", "RA SN", \ + "-SN", "-SN", "SN", "SN", "+SN", "+SN", "IC", "SG", "IC", "PE", \ + "-SHRA", "SHRA", "+SHRA", "-SHSN -SHRA", "SHSN SHRA", "-SNSN", "SHSN", "-SHPE", "SHPE", " ", \ + "SHGR", "-RA", "+RA", "-RA -SN -GR", "+RA +SN +GR", "TSRA", "TSPE", "+TSRA", " ", "+TSPE" ] + + msg = "" + for geo in geometries : + lon = geo.getGeometry().x + lat = geo.getGeometry().y + + sName = geo.getString("stationId") + tobs = geo.getNumber("timeObs") + elev = geo.getNumber("elevation") + typ = geo.getNumber("reportType") + wx = geo.getNumber("wx_present") + vis = geo.getNumber("visibility") + msl = geo.getNumber("seaLevelPress") + p = geo.getNumber("stationPress") + pchg = geo.getNumber("pressChange3Hour") + pchr = geo.getNumber("pressChangeChar") + temp = geo.getNumber("temperature") + dpt = geo.getNumber("dewpoint") + th2o = geo.getNumber("seaSurfaceTemp") + tw = geo.getNumber("wetBulb") + dir = geo.getNumber("windDir") + spd = geo.getNumber("windSpeed") + s10 = geo.getNumber("equivWindSpeed10m") + gust = geo.getNumber("windGust") + pr1 = geo.getNumber("precip1Hour") + pr6 = geo.getNumber("precip6Hour") + pr24 = geo.getNumber("precip24Hour") + + msg += sName + "," + msg += str(tobs/1000) + "," + msg += "%.4f"%lat + "," + msg += "%.4f"%lon + "," + msg += "%.0f"%elev + "," + if typ < 1001 or typ > 1007 : + msg += "-32767," + elif typ == 1001 or typ == 1004 or typ == 1005 : + msg += "0," + else : + msg += "1," + if wx < 0 or wx > 99 : + msg += " ," + else : + msg += wxstr[wx] + "," + msg += str(vis) + "," + msg += "%.2f"%msl + "," + msg += "%.2f"%p + "," + msg += "%.0f"%pchg + "," + if pchr <= -9999 : + pchr = -32767 + msg += str(pchr) + " ," + msg += "%.1f"%temp + "," + msg += "%.1f"%dpt + "," + msg += "%.1f"%th2o + "," + msg += "%.1f"%tw + "," + msg += "%.0f"%dir + "," + msg += "%.1f"%spd + "," + msg += "%.1f"%s10 + "," + msg += "%.1f"%gust + "," + msg += "%.2f"%pr1 + "," + msg += "%.2f"%pr6 + "," + msg += "%.2f"%pr24 + "\n" + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/maritime/a2gtboy.csh b/data/maritime/a2gtboy.csh new file mode 100644 index 0000000..0d7e7d9 --- /dev/null +++ b/data/maritime/a2gtboy.csh @@ -0,0 +1,134 @@ +#!/bin/csh +## +# 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. +## +# +# A script wrapper around a UEngine call that is meant to get all available +# maritime data in the A-II database over a specified range of times. +# The data is output to stdout as ASCII. Each line is one time/platform +# combination. The individual data items are comma delimited. +# This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2gtboy.csh {p} {c} yyyy-mm-dd hh:mm yyyy-mm-dd hh:mm +# +# The literal p and c flags are optional. The p flag means preserve +# the final version of the python submitted to the UEngine instead of +# cleaning it up. The path to the finalized python is /tmp/a2gtboyNNNNN.py +# where NNNNN is a unix process id. The c flag means to retreive the +# Laps set of variables, instead of the default MSAS set. +# +# +# Not using the 'c' format, the MSAS set of variables, outputs the following +# variables for each line: +# +# stationId,timeObs,latitude,longitude,elevation,seaLevelPress, +# stationPress,temperature,dewpoint,windDir,windSpeed,pressChange3Hour +# +# Using the 'c' format, the Laps set of variables, outputs the following +# variables for each line: +# +# stationId,timeObs,latitude,longitude,elevation,reportType,wx_present, +# visibility,seaLevelPress,stationPress,pressChange3Hour,pressChangeChar, +# temperature,dewpoint,seaSurfaceTemp,wetBulb,windDir,windSpeed, +# equivWindSpeed10m,windGust,precip1Hour,precip6Hour,precip24Hour +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/22/2014 3591 nabowle Initial modification. Properly call DAF script. +# +# +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +set stubbase = a2gtboyStub.py +if ( "$1" == "c" ) then + shift + set stubbase = a2cvboyStub.py +endif +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./$stubbase ) then + set stubpy = ./$stubbase +else if ( -e $mydir/$stubbase ) then + set stubpy = $mydir/$stubbase +else if ( -e $FXA_HOME/src/dm/maritime/$stubbase ) then + set stubpy = $FXA_HOME/src/dm/maritime/$stubbase +else if ( -e $FXA_HOME/bin/$stubbase ) then + set stubpy = $FXA_HOME/bin/$stubbase +else + bash -c "echo could not find $stubbase 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" +else + # + # Set up the environment we need to run the UEngine. + # + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set specpy = /tmp/a2gtboy${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" > $specpy + + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | sed -n '2,$p' + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif diff --git a/data/maritime/a2gtboyStub.py b/data/maritime/a2gtboyStub.py new file mode 100644 index 0000000..64e9d47 --- /dev/null +++ b/data/maritime/a2gtboyStub.py @@ -0,0 +1,114 @@ +## +# 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. +## + +# Gets all available MSAS maritime data in the A-II database over a specified +# range of times. The data is output to stdout as ASCII. Each line is one +# time/platform combination. The individual data items are comma delimited. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/18/2014 3591 nabowle Initial modification. Replace UEngine with DAF. +# +# + +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + return parser.parse_args() + + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("sfcobs") + req.setParameters("stationId","timeObs","elevation","seaLevelPress", + "stationPress","temperature","dewpoint","windDir", + "windSpeed","pressChange3Hour" ) + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "No data available." + return + + msg = "" + for geo in geometries : + lon = geo.getGeometry().x + lat = geo.getGeometry().y + + sName = geo.getString("stationId") + tobs = geo.getNumber("timeObs") + elev = geo.getNumber("elevation") + msl = geo.getNumber("seaLevelPress") + p = geo.getNumber("stationPress") + temp = geo.getNumber("temperature") + dpt = geo.getNumber("dewpoint") + dir = geo.getNumber("windDir") + spd = geo.getNumber("windSpeed") + pchg = geo.getNumber("pressChange3Hour") + + + msg += sName + "," + msg += str(tobs/1000) + "," + msg += "%.4f"%lat + "," + msg += "%.4f"%lon + "," + msg += "%.0f"%elev + "," + msg += "%.2f"%msl + "," + msg += "%.2f"%p + "," + msg += "%.1f"%temp + "," + msg += "%.1f"%dpt + "," + msg += "%.0f"%dir + "," + msg += "%.1f"%spd + "," + msg += "%.0f"%pchg + "\n" + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/metar/a2cvmtrStub.py b/data/metar/a2cvmtrStub.py new file mode 100644 index 0000000..43bfcc5 --- /dev/null +++ b/data/metar/a2cvmtrStub.py @@ -0,0 +1,210 @@ +## +# 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. +## + +# Gets all available Laps metar data in the A-II database over a specified range +# of times within a specifed area. The data is output to stdout as ASCII. +# Each line is one time/station combination. The individual data items are comma +# delimited. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/15/2014 3593 nabowle Initial modification. Fix index issues on 2D parameters. +# 09/15/2014 3593 nabowle Replace UEngine with DAF. +# +# + +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + parser.add_argument("--lat-min", action="store", dest="latMin", type=float, + help="Minimum latitude", default=0.0, metavar="lat") + parser.add_argument("--lat-max", action="store", dest="latMax", type=float, + help="Maximum latitude", default=90.0, metavar="lat") + parser.add_argument("--lon-min", action="store", dest="lonMin", type=float, + help="Minimum longitude", default=-180.0, metavar="lon") + parser.add_argument("--lon-max", action="store", dest="lonMax", type=float, + help="Maximum longitude", default=180.0, metavar="lon") + return parser.parse_args() + + +def main(): + # The multi-dimensional parameters. + PRES_PARAMS = set(["presWeather"]) + SKY_PARAMS = set(["skyCover", "skyLayerBase"]) + + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + latMin = user_args.latMin + latMax = user_args.latMax + lonMin = user_args.lonMin + lonMax = user_args.lonMax + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("obs") + req.setParameters("stationName","timeObs","wmoId","autoStationType", + "elevation","reportType","presWeather","visibility","skyCover", + "skyLayerBase","altimeter","seaLevelPress","pressChange3Hour", + "pressChangeChar","temperature","tempFromTenths","dewpoint", + "dpFromTenths","windDir","windSpeed","windGust","maxTemp24Hour", + "minTemp24Hour""","precip1Hour","precip3Hour","precip6Hour", + "precip24Hour") + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "No data available." + return + + msg = "" + wx = [] + cvr = [] + bas = [] + for geoData in geometries: + if set(geoData.getParameters()) & PRES_PARAMS : + wx.append(geoData.getString("presWeather")) + continue + if set(geoData.getParameters()) & SKY_PARAMS : + cvr.append(geoData.getString("skyCover")) + bas.append(geoData.getNumber("skyLayerBase")) + continue + + lon = geoData.getGeometry().x + lat = geoData.getGeometry().y + if lon < lonMin or lon > lonMax or lat < latMin or lat > latMax: + wx = [] + cvr = [] + bas = [] + continue + + sName = geoData.getString("stationName") + tobs = geoData.getNumber("timeObs") + elev = geoData.getNumber("elevation") + ista = geoData.getNumber("wmoId") + atype = geoData.getString("autoStationType") + repTyp = geoData.getString("reportType") + vis = geoData.getNumber("visibility") + alt = geoData.getNumber("altimeter") + msl = geoData.getNumber("seaLevelPress") + pchg = geoData.getNumber("pressChange3Hour") + pchr = geoData.getString("pressChangeChar") + temp = geoData.getNumber("temperature") + t10 = geoData.getNumber("tempFromTenths") + dpt = geoData.getNumber("dewpoint") + td10 = geoData.getNumber("dpFromTenths") + dir = geoData.getNumber("windDir") + spd = geoData.getNumber("windSpeed") + gust = geoData.getNumber("windGust") + tmx = geoData.getNumber("maxTemp24Hour") + tmn = geoData.getNumber("minTemp24Hour") + pr1 = geoData.getNumber("precip1Hour") + pr3 = geoData.getNumber("precip3Hour") + pr6 = geoData.getNumber("precip6Hour") + pr24 = geoData.getNumber("precip24Hour") + + + msg += sName + "," + msg += str(tobs/1000) + "," + msg += "%.4f"%lat + "," + msg += "%.4f"%lon + "," + msg += "%.0f"%elev + "," + if ista < 0 : + msg += "-99," + else : + msg += str(ista) + "," + msg += atype + " ," + msg += repTyp + " ," + msg += wx[0] + " ," + msg += "%.3f"%vis + "," + + + msg += cvr[0]; + kk = 5 + while kk > 0 and cvr[0+kk] == "" : + kk -= 1 + k = 1 + while k <= kk : + msg += "|" + cvr[0+k]; + k += 1 + msg += " ," + msg += "%.1f"%bas[0]; + kk = 5 + while kk > 0 and bas[0+kk] < -9998 : + kk -= 1 + k = 1 + while k <= kk : + msg += "|" + "%.1f"%bas[0+k]; + k += 1 + msg += "," + + msg += "%.2f"%alt + "," + msg += "%.2f"%msl + "," + msg += "%.0f"%pchg + "," + msg += pchr + " ," + msg += "%.1f"%temp + "," + msg += "%.1f"%t10 + "," + msg += "%.1f"%dpt + "," + msg += "%.1f"%td10 + "," + msg += "%.0f"%dir + "," + msg += "%.1f"%spd + "," + msg += "%.1f"%gust + "," + msg += "%.1f"%tmx + "," + msg += "%.1f"%tmn + "," + msg += "%.2f"%pr1 + "," + msg += "%.2f"%pr3 + "," + msg += "%.2f"%pr6 + "," + msg += "%.2f"%pr24 + "\n" + + wx = [] + cvr = [] + bas = [] + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/metar/a2gtmtr.csh b/data/metar/a2gtmtr.csh new file mode 100755 index 0000000..421267e --- /dev/null +++ b/data/metar/a2gtmtr.csh @@ -0,0 +1,189 @@ +#!/bin/csh +## +# 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. +## + +# +# A script wrapper around a UEngine call that is meant to get all available +# metar data in the A-II database over a specified range of times. The data +# is output to stdout as ASCII. Each line is one time/station combination. +# The individual data items are comma delimited. This version can adapt to +# use apython stub that calls the data access framework. +# +# Usage: +# +# a2gtmtr.csh {p} {c} yyyy-mm-dd hh:mm yyyy-mm-dd hh:mm +# +# The literal p and c flags are optional. The p flag means preserve +# the final version of the python submitted to the UEngine instead of +# cleaning it up. The path to the finalized python is /tmp/a2gtmtrNNNNN.py +# where NNNNN is a unix process id. The c flag means to retreive the +# Laps set of variables, instead of the default MSAS set. +# +# Not using the 'c' format, the MSAS set of variables, outputs the following +# variables for each line: +# +# stationName,timeObs,latitude,longitude,elevation,wmoId,autoStationType +# seaLevelPress,temperature,dewpoint,windDir,windSpeed,altimeter +# +# Using the 'c' format, the Laps set of variables, outputs the following +# variables for each line: +# +# stationName,timeObs,latitude,longitude,elevation,wmoId,autoStationType +# reportType,presWeather,visibility,skyCover,skyLayerBase,altimeter +# seaLevelPress,pressChange3Hour,pressChangeChar,temperature,tempFromTenths +# dewpoint,dpFromTenths,windDir,windSpeed,windGust,maxTemp24Hour, +# minTemp24Hour,precip1Hour,precip3Hour,precip6Hour,precip24Hour +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/15/2014 3593 nabowle Initial modification to properly use DAF version of the script. +# +# + +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +if ( ! $?FXA_LOCAL_SITE ) set FXA_LOCAL_SITE = xxxx +if ( ! $?FXA_INGEST_SITE ) set FXA_INGEST_SITE = $FXA_LOCAL_SITE +# +set stubbase = a2gtmtrStub.py +if ( "$1" == "c" ) then + shift + set stubbase = a2cvmtrStub.py +endif +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./$stubbase ) then + set stubpy = ./$stubbase +else if ( -e $mydir/$stubbase ) then + set stubpy = $mydir/$stubbase +else if ( -e $FXA_HOME/src/dm/metar/$stubbase ) then + set stubpy = $FXA_HOME/src/dm/metar/$stubbase +else if ( -e $FXA_HOME/bin/$stubbase ) then + set stubpy = $FXA_HOME/bin/$stubbase +else + bash -c "echo could not find $stubbase 1>&2" + exit +endif + +# +# Attempt to use current D-2D localization to determine lat/lon bounds. +# +set ltmn = 0 +set ltmx = 90 +set lnmn = -180 +set lnmx = 180 +set locDir = $FXA_HOME/data/localizationDataSets/$FXA_INGEST_SITE +while ( -e $locDir/CenterPoint.dat ) + grep conusScale $locDir/scaleInfo.txt >& /dev/null + if ( $status == 0 ) then + set ltmn = 15 + set ltmx = 60 + set lnmn = -145 + set lnmx = -55 + break + endif + set cenLoc = `cat $locDir/CenterPoint.dat` + if ( $#cenLoc != 2 ) break + set cenlat = `echo $cenLoc[1] | cut '-d.' -f1` + set cenlat = `( @ x = $cenlat + 0 >& /dev/null ; echo $x )` + if ( "$cenlat" == "" ) break + set cenlon = `echo $cenLoc[2] | cut '-d.' -f1` + set cenlon = `( @ x = $cenlon + 0 >& /dev/null ; echo $x )` + if ( "$cenlon" == "" ) break + if ( $cenlat > 75 ) then + set ltmn = 55 + break + endif + if ( $cenlat > 50 ) then + @ ltmn = $cenlat - 20 + break + endif + @ ltmn = $cenlat - 20 + @ ltmx = $cenlat + 20 + @ lnmn = $cenlon - 20 + @ lnmx = $cenlon + 20 + break +end + +# Colorado bounds +set ltmn = 37 +set ltmx = 41 +set lnmn = -109 +set lnmx = -102 + +# +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + echo "/awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" --lat-min $ltmn --lat-max $ltmx --lon-min $lnmn --lon-max $lnmx" + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" --lat-min $ltmn --lat-max $ltmx --lon-min $lnmn --lon-max $lnmx +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set specpy = /tmp/a2gtmtr${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/LTMN/$ltmn/g" | sed "s/LTMX/ /g" | \ + sed "s/LNMN/$lnmn/g" | sed "s/LNMX/$lnmx/g" | \ + sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" > $specpy + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | sed -n '3,$p' + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif +# diff --git a/data/metar/a2gtmtrStub.py b/data/metar/a2gtmtrStub.py new file mode 100644 index 0000000..bbfbb9d --- /dev/null +++ b/data/metar/a2gtmtrStub.py @@ -0,0 +1,138 @@ +## +# 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. +## + +# Gets all available metar data in the A-II database over a specified range of +# times within a specifed area. The data is output to stdout as ASCII. +# Each line is one time/station combination. The individual data items are comma +# delimited. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 09/15/2014 3593 nabowle Initial modification. Fix losing first record. +# 09/15/2014 3593 nabowle Replace UEngine with DAF. +# +# + +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-s", action="store", dest="stid", metavar="stid") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + parser.add_argument("--lat-min", action="store", dest="latMin", type=float, + help="Minimum latitude", default=0.0, metavar="lat") + parser.add_argument("--lat-max", action="store", dest="latMax", type=float, + help="Maximum latitude", default=90.0, metavar="lat") + parser.add_argument("--lon-min", action="store", dest="lonMin", type=float, + help="Minimum longitude", default=-180.0, metavar="lon") + parser.add_argument("--lon-max", action="store", dest="lonMax", type=float, + help="Maximum longitude", default=180.0, metavar="lon") + return parser.parse_args() + + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + if user_args.stid: + stid = user_args.stid + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + latMin = user_args.latMin + latMax = user_args.latMax + lonMin = user_args.lonMin + lonMax = user_args.lonMax + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("obs") + req.setParameters("stationName","timeObs","wmoId","autoStationType", + "elevation","seaLevelPress","temperature","dewpoint", + "windDir","windSpeed","altimeter" ) + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "No data available." + return + + msg = "" + for geo in geometries : + lon = geo.getGeometry().x + lat = geo.getGeometry().y + # this is actually really dumb... + if lon < lonMin or lon > lonMax or lat < latMin or lat > latMax: + continue + ista = geo.getString("wmoId") + sName = geo.getString("stationName") + if 'stid' in locals() and stid != sName: + continue + tobs = geo.getNumber("timeObs") + elev = geo.getNumber("elevation") + atype = geo.getString("autoStationType") + msl = geo.getNumber("seaLevelPress") + temp = geo.getNumber("temperature") + dpt = geo.getNumber("dewpoint") + dir = geo.getNumber("windDir") + spd = geo.getNumber("windSpeed") + alt = geo.getNumber("altimeter") + + msg += sName + "," + msg += str(tobs/1000) + "," + msg += "%.4f"%lat + "," + msg += "%.4f"%lon + "," + msg += "%.0f"%elev + "," + msg += str(ista) + "," + msg += atype + " ," + msg += "%.2f"%msl + "," + msg += "%.1f"%temp + "," + msg += "%.1f"%dpt + "," + msg += "%.0f"%dir + "," + msg += "%.1f"%spd + "," + msg += "%.2f"%alt + "\n" + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/profiler/a2gtprof.csh b/data/profiler/a2gtprof.csh new file mode 100644 index 0000000..855eb64 --- /dev/null +++ b/data/profiler/a2gtprof.csh @@ -0,0 +1,129 @@ +#!/bin/csh +## +# 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. +## +# +# A script wrapper around a UEngine call that is meant to get all available +# profiler data in the A-II database over a specified range of times. The +# data is output to stdout as ASCII. Each line is one time/station combination. +# The individual data variables are comma delimited, and when what is returned +# for a data item is a profile, each item in the profile is vertical bar +# delimited. This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2gtprof.csh {p} yyyy-mm-dd hh:mm yyyy-mm-dd hh:mm +# +# The literal p flag is optional. The p flag means preserve +# the final version of the python submitted to the UEngine instead of +# cleaning it up. The path to the finalized python is /tmp/a2gtprofNNNNN.py +# where NNNNN is a unix process id. +# +# The following data variables are output for each line: +# +# profilerId,validTime,latitude,longitude,elevation,pressure, +# temperature,relHumidity,windDirSfc,windSpeedSfc,rainRate,submode, +# height,levelMode,uComponent,vComponent,wComponent, +# peakPower,HorizSpStdDev,VertSpStdDev,uvQualityCode,consensusNum +# +# Everything from height onward are profiles. +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# Oct 6, 2014 3594 nabowle Initial modification. Handle DAF version. +# +# +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +if ( ! $?FXA_LOCAL_SITE ) set FXA_LOCAL_SITE = xxxx +if ( ! $?FXA_INGEST_SITE ) set FXA_INGEST_SITE = $FXA_LOCAL_SITE +# +# Locate python stub that we will modify to create the final python logic. +# +set stubbase = a2gtprofStub.py +if ( -e ./$stubbase ) then + set stubpy = ./$stubbase +else if ( -e $mydir/$stubbase ) then + set stubpy = $mydir/$stubbase +else if ( -e $FXA_HOME/src/dm/profiler/$stubbase ) then + set stubpy = $FXA_HOME/src/dm/profiler/$stubbase +else if ( -e $FXA_HOME/bin/$stubbase ) then + set stubpy = $FXA_HOME/bin/$stubbase +else + bash -c "echo could not find $stubbase 1>&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set specpy = /tmp/a2gtprof${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" > $specpy + + cd $UE_BIN_PATH + #uengine -r python < $specpy + ( uengine -r python < $specpy ) | grep -v '<' | sed -n '2,$p' + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + diff --git a/data/profiler/a2gtprofStub.py b/data/profiler/a2gtprofStub.py new file mode 100644 index 0000000..560cff5 --- /dev/null +++ b/data/profiler/a2gtprofStub.py @@ -0,0 +1,184 @@ +## +# 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. +## + +# Gets all available profiler data in the A-II database over a specified range +# of times. The data is output to stdout as ASCII. Each line is one +# time/station combination. The individual data variables are comma delimited, +# and when what is returned for a data item is a profile, each item in the +# profile is vertical bar delimited +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# Oct 6, 2014 3594 nabowle Initial modification. Replace UEngine with DAF. +# +# + +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + return parser.parse_args() + +def main(): + # The multi-dimensional parameters. + MULTI_DIM_PARAMS = set(['vComponent', 'uComponent', 'peakPower', + 'levelMode', 'uvQualityCode', 'consensusNum', + 'HorizSpStdDev', 'wComponent', 'height', + 'VertSpStdDev']) + + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("profiler") + req.setParameters('numProfLvls', 'elevation', 'windDirSfc', 'validTime', + 'windSpeedSfc', 'pressure', 'submode', 'relHumidity', + 'profilerId', 'rainRate', 'temperature') + req.getParameters().extend(MULTI_DIM_PARAMS) + + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "couldn't get data" + return + + + subgeos = [] + msg = "" + for geoData in geometries : + if set(geoData.getParameters()) & MULTI_DIM_PARAMS : + subgeos.append(geoData) + continue + + elev = geoData.getNumber("elevation") + msg += geoData.getString("profilerId") + "," + msg += str(geoData.getNumber("validTime")/1000) + "," + msg += "%.4f"%geoData.getGeometry().y + "," + msg += "%.4f"%geoData.getGeometry().x + "," + msg += "%.0f"%elev + "," + msg += "%.1f"%geoData.getNumber("pressure") + "," + msg += "%.1f"%geoData.getNumber("temperature") + "," + msg += "%.1f"%geoData.getNumber("relHumidity") + "," + msg += "%.0f"%geoData.getNumber("windDirSfc") + "," + msg += "%.1f"%geoData.getNumber("windSpeedSfc") + "," + msg += "%.1f"%geoData.getNumber("rainRate") + "," + msg += str(geoData.getNumber("submode")) + "," + + kk = len(subgeos) +# msg += str(kk) + "," + + subgeos[0].getString("consensusNum") + if kk>0 : msg += "%.0f"%(subgeos[0].getNumber("height")-elev) + k = 1 + while k < kk : + msg += "|" + "%.0f"%(subgeos[k].getNumber("height")-elev) + k += 1 + msg += "," + if kk>0 : msg += str(subgeos[0].getNumber("levelMode")) + k = 1 + while k < kk : + msg += "|" + str(subgeos[k].getNumber("levelMode")) + k += 1 + msg += "," + + if kk>0 : msg += "%.1f"%subgeos[0].getNumber("uComponent") + k = 1 + while k < kk : + msg += "|" + "%.1f"%subgeos[k].getNumber("uComponent") + k += 1 + msg += "," + if kk>0 : msg += "%.1f"%subgeos[0].getNumber("vComponent") + k = 1 + while k < kk : + msg += "|" + "%.1f"%subgeos[k].getNumber("vComponent") + k += 1 + msg += "," + if kk>0 : msg += "%.2f"%subgeos[0].getNumber("wComponent") + k = 1 + while k < kk : + msg += "|" + "%.2f"%subgeos[k].getNumber("wComponent") + k += 1 + msg += "," + + if kk>0 : msg += "%.1f"%subgeos[0].getNumber("peakPower") + k = 1 + while k < kk : + msg += "|" + "%.1f"%subgeos[k].getNumber("peakPower") + k += 1 + msg += "," + if kk>0 : msg += "%.1f"%subgeos[0].getNumber("HorizSpStdDev") + k = 1 + while k < kk : + msg += "|" + "%.1f"%subgeos[k].getNumber("HorizSpStdDev") + k += 1 + msg += "," + if kk>0 : msg += "%.1f"%subgeos[0].getNumber("VertSpStdDev") + k = 1 + while k < kk : + msg += "|" + "%.1f"%subgeos[k].getNumber("VertSpStdDev") + k += 1 + msg += "," + + if kk>0 : msg += subgeos[0].getString("uvQualityCode") + k = 1 + while k < kk : + msg += "|" + subgeos[k].getString("uvQualityCode") + k += 1 + msg += "," + if kk>0 : msg += subgeos[0].getString("consensusNum") + k = 1 + while k < kk : + msg += "|" + subgeos[k].getString("consensusNum") + k += 1 + msg += "\n" + subgeos = [] + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/radar/a2advrad.csh b/data/radar/a2advrad.csh new file mode 100644 index 0000000..f9f0bfc --- /dev/null +++ b/data/radar/a2advrad.csh @@ -0,0 +1,232 @@ +#!/bin/csh +## +# 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. +## + +# +# A script wrapper that is meant to get data for a single radar product +# from the A-II database. The result is output to stdout as ASCII. +# The first line has the dimensions of the data, the volume scan time, +# 'radial' or 'raster', elevation number, a product description, the tilt +# angle or layer, and the VCP. The second line contains the level labels, +# and the third line has a partial list of the product dependent parameters. +# If the product is radial, the fourth line contains a list of the +# radial angles. Otherwise each line after that has data for one +# radial/row, as a sequence of space delimited plain decimal integers. +# +# The product description includes the mnemonic, the resolution, and +# the bit depth. If the azimuthal resolution is finer than 1 degree, +# the product description will additionally include a note of that. +# The product dependent parameters as defined in an 88D RPG product +# are 28 signed two byte integers. The list here includes those +# with indices from 17 to 26 (C indexing). +# +# Note that for now, this is only designed to return data for image +# products. +# +# Usage: +# +# a2advrad.csh {p} {x} radar msgcode {elev} date time {slop} +# +# p - A literal p. (optional) +# x - A literal x. (optional) Expanded set of header information. +# radar - four character radar id +# msgcode - RPG message code +# elev - tilt angle/layer value. defaults to 0. +# date - yyyy-mm-dd +# time - hh:mm +# slop - seconds of slop either side, defaults to 60 +# +# The tilt angles specified are primary tilt angles for a range of tilts. +# +# The literal p option means preserve the final version of the python +# submitted to the UEngine instead of cleaning it up. The path to the +# finalized python is /tmp/a2advradNNNNN.py where NNNNN is a unix process id. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/07/2014 3393 nabowle Initial modification. Passes parameters straight to +# non-uengine script instead of sed. Remove use of gtasUtil +# if not using the uengine stub. +# +# +set rmpy = yes +set fff = "" +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +if ( "$1" == "x" ) then + set fff = "x" + shift +endif +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +set fxa_home = $FXA_HOME +if ( $?STAGING ) then + set fxa_home = $STAGING/D-2D +endif + +# +# Locate python stub that we will modify to create the final UEngine script +# +if ( -e ./a2advradStub.py ) then + set stubpy = ./a2advradStub.py +else if ( -e $mydir/a2advradStub.py ) then + set stubpy = $mydir/a2advradStub.py +else if ( -e $fxa_home/src/dm/radar/a2advradStub.py ) then + set stubpy = $fxa_home/src/dm/radar/a2advradStub.py +else if ( -e $FXA_HOME/bin/a2advradStub.py ) then + set stubpy = $FXA_HOME/bin/a2advradStub.py +else + bash -c "echo could not find a2advradStub.py 1>&2" + exit +endif + +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set method = "daf" +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv +endif + +# +# Locate file that lets us provide a description of the data set. +# +if ( -e ./msgCodeSeds.txt ) then + set mctrans = $PWD/msgCodeSeds.txt +else if ( -e $mydir/msgCodeSeds.txt ) then + set mctrans = $mydir/msgCodeSeds.txt +else if ( -e $fxa_home/src/dm/radar/msgCodeSeds.txt ) then + set mctrans = $fxa_home/src/dm/radar/msgCodeSeds.txt +else if ( -e $FXA_HOME/data/msgCodeSeds.txt ) then + set mctrans = $FXA_HOME/data/msgCodeSeds.txt +else + bash -c "echo could not find msgCodeSeds.txt 1>&2" + exit +endif +# +# +set rrr = $1 +set mmm = $2 +shift +shift +set ddd = `echo $mmm | sed -f $mctrans | cut '-d|' -f2 ` + +set eee = `echo $1 | grep -v '.*-'` +if ( "$eee" != "" ) shift +set slop = `echo $3 | grep '[0-9]'` +if ( "$slop" == "" ) set slop = 60 + + +if ( "$method" == "daf" ) then + set datetime = $1' '$2 + set opts = "" + + if ( "$eee" != "" ) then + set opts = "$opts --angle $eee" + endif + + if ( "$fff" == "x" ) then + set opts = "$opts --extended" + endif + + /awips2/python/bin/python $stubpy --radar $rrr --code $mmm --datetime="${datetime}" --slop $slop --description="${ddd}" $opts +else + # + # Get program that can do math with ascii time string, then use this to + # properly encode range of times for which we look for data. + # + if ( -x ./gtasUtil ) then + set gtasUtil = ./gtasUtil + else if ( -x $mydir/gtasUtil ) then + set gtasUtil = $mydir/gtasUtil + else if ( -x $fxa_home/src/dm/point/gtasUtil ) then + set gtasUtil = $fxa_home/src/dm/point/gtasUtil + else if ( -x $FXA_HOME/bin/gtasUtil ) then + set gtasUtil = $FXA_HOME/bin/gtasUtil + else + bash -c "echo could not find gtasUtil executable 1>&2" + exit + endif + + set aaa = `$gtasUtil = $1 $2 -$slop` + set bbb = `$gtasUtil = $1 $2 $slop` + + # + # Modify the text of special tags in stub to create finalized script. + # + set specpy = /tmp/a2advrad${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + if ( "$eee" == "" ) then + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$mmm/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | sed "s/FFF/$fff/g" | \ + sed "s/DDDDD/$ddd/g" | sed 's/^.*EEEE.*$//g' >> $specpy + else + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$mmm/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | sed "s/FFF/$fff/g" | \ + sed "s/DDDDD/$ddd/g" | sed "s/EEEE/$eee/g" >> $specpy + endif + # + # Submit the temporary python script stripping xml stuff, then remove it + # + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | sed 's/>/>/g' | \ + sed 's/</& /dev/null +endif +# diff --git a/data/radar/a2advradStub.py b/data/radar/a2advradStub.py new file mode 100644 index 0000000..06dda8f --- /dev/null +++ b/data/radar/a2advradStub.py @@ -0,0 +1,128 @@ +## +# 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. +## + +# +# Gets data for a single radar product from the A-II database. The result is +# output to stdout as ASCII. This uses a data-specific Request/Response instead +# of the DataAccessLayer in order to preserve data-genericness of the interface. +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/13/2014 3393 nabowle Initial modification. Replaces UEngine +# with a custom Request/Response. +# +# + +import argparse +import a2radcommon + +def get_args(): + parser = a2radcommon.get_args_parser() + parser.add_argument("--extended", action='store_true', default=False, + dest="extended", help="Output the extended header.") + return parser.parse_args() + + +def main(): + user_args = get_args() + + records = a2radcommon.send_request(user_args) + + if not records: + # print "Data not available" + return + + description = user_args.description + if not description: + print >> sys.stderr, "Description not provided" + return + + format = user_args.extended + + print_record(records[0], format, description) + + +def print_record(record, format, description): + idra = record.getHdf5Data() + + rdat,azdat,depVals,threshVals = a2radcommon.get_hdf5_data(idra) + + if not rdat: + # Graphic, XY + # print "Unsupported radar format" + return + + dim = rdat.getDimension() + if dim != 2: + # print "Data not available" + return + + yLen = rdat.getSizes()[0] + xLen = rdat.getSizes()[1] + + # byte[] -- the raw data + array = rdat.getByteData() + arraySize = len(array) + if xLen * yLen != arraySize: + # print "Data not available" + return + + # get data for azimuth angles if we have them. + if azdat : + azVals = azdat.getFloatData() + azValsLen = len(azVals) + if yLen != azValsLen: + # print "Data not available" + return + + msg = a2radcommon.get_header(record, format, xLen, yLen, azdat, description) + + msg += a2radcommon.encode_thresh_vals(threshVals) + msg += a2radcommon.encode_dep_vals(depVals) + if azdat : + msg += a2radcommon.encode_radial(azVals) + msg += encode_data(yLen, xLen, array) + + print msg + + +def encode_data(yLen, xLen, array): + nxy = yLen*xLen + j = 0 + msg = "" + while j&2" + exit +endif +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set method = "daf" +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv +endif +# +# Locate file that lets us provide a description of the data set. +# +if ( -e ./msgCodeSeds.txt ) then + set mctrans = $PWD/msgCodeSeds.txt +else if ( -e $mydir/msgCodeSeds.txt ) then + set mctrans = $mydir/msgCodeSeds.txt +else if ( -e $fxa_home/src/dm/radar/msgCodeSeds.txt ) then + set mctrans = $fxa_home/src/dm/radar/msgCodeSeds.txt +else if ( -e $FXA_HOME/data/msgCodeSeds.txt ) then + set mctrans = $FXA_HOME/data/msgCodeSeds.txt +else + bash -c "echo could not find msgCodeSeds.txt 1>&2" + exit +endif +# +# +set rrr = $1 +set mmm = $2 +shift +shift +set ddd = `echo $mmm | sed -f $mctrans | cut '-d|' -f2 ` + +set eee = `echo $1 | grep -v '.*-'` +if ( "$eee" != "" ) shift +set slop = `echo $3 | grep '[0-9]'` +if ( "$slop" == "" ) set slop = 60 + +if ( "$method" == "daf" ) then + set datetime = $1' '$2 + set opts = "" + + if ( "$eee" != "" ) then + set opts = "$opts --angle $eee" + endif + + if ( "$fff" == "x" ) then + set opts = "$opts --extended" + endif + if ( "$encoding" == "1" ) then + set opts = "$opts --hex" + else if ( "$encoding" == "0" ) then + set opts = "$opts --int" + endif + + /awips2/python/bin/python $stubpy --radar $rrr --code $mmm --datetime="${datetime}" --slop $slop --description="${ddd}" $opts +else + # + # Get program that can do math with ascii time string, then use this to + # properly encode range of times for which we look for data. + # + if ( -x ./gtasUtil ) then + set gtasUtil = ./gtasUtil + else if ( -x $mydir/gtasUtil ) then + set gtasUtil = $mydir/gtasUtil + else if ( -x $fxa_home/src/dm/point/gtasUtil ) then + set gtasUtil = $fxa_home/src/dm/point/gtasUtil + else if ( -x $FXA_HOME/bin/gtasUtil ) then + set gtasUtil = $FXA_HOME/bin/gtasUtil + else + bash -c "echo could not find gtasUtil executable 1>&2" + exit + endif + + set aaa = `$gtasUtil = $1 $2 -$slop` + set bbb = `$gtasUtil = $1 $2 $slop` + # + # Modify the text of special tags in stub to create finalized script. + # + set specpy = /tmp/a2gtrad${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + if ( "$eee" == "" ) then + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$mmm/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | sed "s/FFF/$fff/g" | \ + sed "s/DDDDD/$ddd/g" | sed 's/^.*EEEE.*$//g' | \ + sed "s/XXXXX/$encoding/g" >> $specpy + else + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$mmm/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | sed "s/FFF/$fff/g" | \ + sed "s/DDDDD/$ddd/g" | sed "s/EEEE/$eee/g" | \ + sed "s/XXXXX/$encoding/g" >> $specpy + endif + # + # Submit the temporary python script stripping xml stuff, then remove it + # + + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | sed 's/>/>/g' | \ + sed 's/</& /dev/null +endif + +# diff --git a/data/radar/a2gtradStub.py b/data/radar/a2gtradStub.py new file mode 100644 index 0000000..c5af7ce --- /dev/null +++ b/data/radar/a2gtradStub.py @@ -0,0 +1,167 @@ +## +# 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. +## + +# +# Gets data for a single radar product from the A-II database. The result is +# output to stdout as ASCII. This uses a data-specific Request/Response instead +# of the DataAccessLayer in order to preserve data-genericness of the interface. +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/11/2014 3393 nabowle Initial modification. Replaces UEngine +# with a custom Request/Response. +# 12/16/2014 3393 nabowle Fix negative k values. +# +# + +import argparse +import a2radcommon + +def get_args(): + parser = a2radcommon.get_args_parser() + parser.add_argument("--hex", action='store_const', dest="encoding", + const=1, help="Hex encoding.", metavar="encoding") + parser.add_argument("--int", action='store_const', dest="encoding", + const=0, help="Delimited integer encoding.", + metavar="encoding") + parser.add_argument("--extended", action='store_true', default=False, + dest="extended", help="Output the extended header.") + return parser.parse_args() + + +def main(): + user_args = get_args() + + records = a2radcommon.send_request(user_args) + + if not records: + # print "Data not available" + return + + description = user_args.description + if not description: + print >> sys.stderr, "Description not provided" + return + + format = user_args.extended + encoding = user_args.encoding + + print_record(records[0], format, description, encoding) + + +def print_record(record, format, description, encoding): + + idra = record.getHdf5Data() + + rdat,azdat,depVals,threshVals = a2radcommon.get_hdf5_data(idra) + + if not rdat: + # Graphic, XY + # print "Unsupported radar format" + return + + dim = rdat.getDimension() + if dim != 2: + # print "Data not available" + return + + yLen = rdat.getSizes()[0] + xLen = rdat.getSizes()[1] + + # byte[] -- the raw data + array = rdat.getByteData() + arraySize = len(array) + if xLen * yLen != arraySize: + # print "Data not available" + return + + # get data for azimuth angles if we have them. + if azdat : + azVals = azdat.getFloatData() + azValsLen = len(azVals) + if yLen != azValsLen: + # print "Data not available" + return + + msg = a2radcommon.get_header(record, format, xLen, yLen, azdat, description) + + msg += a2radcommon.encode_thresh_vals(threshVals) + msg += a2radcommon.encode_dep_vals(depVals) + if azdat : + msg += a2radcommon.encode_radial(azVals) + msg += encode_data(yLen, xLen, array, encoding) + + print msg.strip() + + +def encode_data(yLen, xLen, array, encoding): + plus = " ghijklmnopqrstuvwxyz" + minus = " GHIJKLMNOPQRSTUVWXYZ" + nxy = yLen*xLen + j = 0 + msg = "" + while jkk+20 or kkk : + msg += plus[k-kk] + else : + msg += minus[kk-k] + kk = k + i += 1 + msg += "\n" + j += xLen + return msg + + +if __name__ == '__main__': + main() + diff --git a/data/radar/a2gtradStubAll.py b/data/radar/a2gtradStubAll.py new file mode 100644 index 0000000..34dc4a5 --- /dev/null +++ b/data/radar/a2gtradStubAll.py @@ -0,0 +1,267 @@ +## +# 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. +## + +# +# Gets data for a single radar product from the A-II database. The result is +# output to stdout as ASCII. This uses a data-specific Request/Response instead +# of the DataAccessLayer in order to preserve data-genericness of the interface. +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/11/2014 3393 nabowle Initial modification. Replaces UEngine +# with a custom Request/Response. +# +# + +import argparse +import a2radcommon + +def get_args(): + parser = a2radcommon.get_args_parser() + return parser.parse_args() + + +def main(): + user_args = get_args() + + records = a2radcommon.send_request(user_args) + + if not records: + # print "Data not available" + return + + description = user_args.description + if not description: + print >> sys.stderr, "Description not provided" + return + + print_record(records[0], description) + + +def print_record(record, description): + + idra = record.getHdf5Data() + + rdat,azdat,depVals,prodVals,recVals,stormVals,symVals,symData,threshVals = get_hdf5_data(idra) + + if not rdat: + # Graphic, XY + # print "Unsupported radar format" + return + + dim = rdat.getDimension() + if dim != 2: + # print "Data not available" + return + + yLen = rdat.getSizes()[0] + xLen = rdat.getSizes()[1] + + # byte[] -- the raw data + array = rdat.getByteData() + arraySize = len(array) + if xLen * yLen != arraySize: + # print "Data not available" + return + + # get data for azimuth angles if we have them. + if azdat : + azVals = azdat.getFloatData() + azValsLen = len(azVals) + if yLen != azValsLen: + # print "Data not available" + return + + msg = get_header(record, xLen, yLen, azdat, description) + msg += encode_dep_vals(depVals) + msg += encode_prod_vals(prodVals) + msg += encode_rec_vals(recVals) + msg += encode_storm_vals(stormVals) + msg += encode_sym_vals(symVals) + msg += encode_sym_data(symData) + msg += encode_thresh_vals(threshVals) + + if azdat : + msg += a2radcommon.encode_radial(azVals) + + msg += encode_data(yLen, xLen, array) + + print msg + + +def get_hdf5_data(idra): + rdat = [] + azdat = [] + depVals = [] + prodVals = [] + recVals = [] + stormVals = [] + symVals = [] + symData = [] + threshVals = [] + if len(idra) > 0: + for ii in range(len(idra)): + if idra[ii].getName() == "Data": + rdat = idra[ii] + elif idra[ii].getName() == "Angles": + azdat = idra[ii] + dattyp = "radial" + elif idra[ii].getName() == "DependentValues": + depVals = idra[ii].getShortData() + elif idra[ii].getName() == "ProductVals": + prodVals = idra[ii].getByteData() + elif idra[ii].getName() == "RecordVals": + recVals = idra[ii].getByteData() + elif idra[ii].getName() == "StormIds": + stormVals = idra[ii].getByteData() + elif idra[ii].getName() == "Symbology": + symVals = idra[ii].getByteData() + elif idra[ii].getName() == "SymbologyData": + symData = idra[ii].getByteData() + elif idra[ii].getName() == "Thresholds": + threshVals = idra[ii].getShortData() + + return rdat,azdat,depVals,prodVals,recVals,stormVals,symVals,symData,threshVals + + +def get_header(record, xLen, yLen, azdat, description): + # Encode dimensions, time, mapping, description, tilt, and VCP + mytime = a2radcommon.get_datetime_str(record) + dattyp = a2radcommon.get_data_type(azdat) + + msg = str(xLen) + " " + str(yLen) + " " + mytime + " " + dattyp + \ + " " + description + "\n" + \ + str(record.getTrueElevationAngle()) + " " + \ + str(record.getVolumeCoveragePattern()) + "\n" + return msg + + +def encode_dep_vals(depVals): + nnn = len(depVals) + msg = str(nnn) + j = 0 + while j&2" + exit +endif + +set rrr = `echo $1 | grep '[a-z][a-z][a-z][a-z]'` +if ( "$rrr" != "" ) shift +set lastcmd = cat + +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set mydate = `echo "$1" | grep '.*-.*-'` + set mytime = `echo "$2" | grep ':'` + if ( "$mydate" != "" && "$mytime" != "" ) then + shift + shift + set userargs = "--date ${mydate} --time ${mytime}" + else + set userargs = "" + endif + + if ( "$rrr" == "" ) then + #done + else if ( "$1" == "" ) then + set userargs = "$userargs --icao $rrr" + else if ( "$1" == "+" ) then + set userargs = "$userargs --icao $rrr" + if ( -e ./msgCodeSeds.txt ) then + set mctrans = $PWD/msgCodeSeds.txt + else if ( -e $mydir/msgCodeSeds.txt ) then + set mctrans = $mydir/msgCodeSeds.txt + else if ( -e $fxa_home/src/dm/radar/msgCodeSeds.txt ) then + set mctrans = $fxa_home/src/dm/radar/msgCodeSeds.txt + else if ( -e $FXA_HOME/data/msgCodeSeds.txt ) then + set mctrans = $FXA_HOME/data/msgCodeSeds.txt + else + bash -c "echo could not find msgCodeSeds.txt 1>&2" + exit + endif + set lastcmd = "sed -f $mctrans" + else if ( "$2" == "" ) then + set userargs = "$userargs --icao $rrr --productCode $1 --angle 0.0 --outputDate" + else if ( "$2" == "+" ) then + set userargs = "$userargs --icao $rrr --productCode $1 --outputPrimary" + else + set userargs = "$userargs --icao $rrr --productCode $1 --angle $2 --outputTrue --outputDate" + endif + /awips2/python/bin/python $stubpy ${userargs} | $lastcmd +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + # + # Set range of time we will request this information over, will default to + # essentially forever. + # + set aaa = "1970-01-01 00:00:00.0" + set bbb = "2038-01-01 00:00:00.0" + set mydate = `echo "$1" | grep '.*-.*-'` + set mytime = `echo "$2" | grep ':'` + if ( "$mydate" != "" && "$mytime" != "" ) then + shift + shift + if ( -x ./gtasUtil ) then + set gtasUtil = ./gtasUtil + else if ( -x $mydir/gtasUtil ) then + set gtasUtil = $mydir/gtasUtil + else if ( -x $fxa_home/src/dm/point/gtasUtil ) then + set gtasUtil = $fxa_home/src/dm/point/gtasUtil + else if ( -x $FXA_HOME/bin/gtasUtil ) then + set gtasUtil = $FXA_HOME/bin/gtasUtil + else + bash -c "echo could not find gtasUtil executable 1>&2" + exit + endif + set aaa = `$gtasUtil = $mydate $mytime -60` + set bbb = `$gtasUtil = $mydate $mytime 60` + endif + + + # + # Modify the text of special tags in stub to create finalized script. + # + set binary = no + set specpy = /tmp/a2invrad${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + if ( "$rrr" == "" ) then + cat $stubpy | grep -v "KKKK" | grep -v "MMMM" | grep -v "EEEE" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | \ + grep -v 'Code")' | grep -v 'Time")' | grep -v 'Angle")' \ + >> $specpy + else if ( "$1" == "" ) then + cat $stubpy | sed "s/KKKK/$rrr/g" | grep -v "MMMM" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | grep -v 'icao")' | \ + sed 's/^.*EEEE.*$//g' | grep -v 'Time")' | grep -v 'Angle")' \ + >> $specpy + else if ( "$1" == "+" ) then + cat $stubpy | sed "s/KKKK/$rrr/g" | grep -v "MMMM" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | grep -v 'icao")' | \ + sed 's/^.*EEEE.*$//g' | grep -v 'Time")' | grep -v 'Angle")' \ + >> $specpy + if ( -e ./msgCodeSeds.txt ) then + set mctrans = $PWD/msgCodeSeds.txt + else if ( -e $mydir/msgCodeSeds.txt ) then + set mctrans = $mydir/msgCodeSeds.txt + else if ( -e $fxa_home/src/dm/radar/msgCodeSeds.txt ) then + set mctrans = $fxa_home/src/dm/radar/msgCodeSeds.txt + else if ( -e $FXA_HOME/data/msgCodeSeds.txt ) then + set mctrans = $FXA_HOME/data/msgCodeSeds.txt + else + bash -c "echo could not find msgCodeSeds.txt 1>&2" + exit + endif + set lastcmd = "sed -f $mctrans" + else if ( "$2" == "" ) then + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$1/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | grep -v 'icao")' | \ + sed 's/EEEE/0.0/g' | grep -v 'Angle")' | grep -v 'Code")' \ + >> $specpy + else if ( "$2" == "+" ) then + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$1/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | grep -v 'icao")' | \ + sed 's/^.*EEEE.*$//g' | grep -v 'Time")' | grep -v 'Code")' | \ + sed 's/true/primary/g' >> $specpy + else + cat $stubpy | sed "s/KKKK/$rrr/g" | sed "s/MMMM/$1/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | grep -v 'icao")' | \ + sed "s/EEEE/$2/g" | grep -v 'Code")' >> $specpy + set binary = yes + endif + # + # Submit the temporary python script stripping xml stuff, then remove it + # + if ( "$binary" == "yes" ) then + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) |& sed 's|.*.*|@|g' | \ + grep -E 'attributes|@' | cut '-d"' -f4 | tr '\n' ' ' | tr '@' '\n' | \ + sed 's/00000.*$//g' | sed 's/^ *//g' | sed 's/ *$//g' + else + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) |& grep attributes | cut '-d"' -f4 | \ + $lastcmd + endif + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + diff --git a/data/radar/a2invradStub.py b/data/radar/a2invradStub.py new file mode 100644 index 0000000..15738b1 --- /dev/null +++ b/data/radar/a2invradStub.py @@ -0,0 +1,195 @@ +## +# 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. +## + +# Gets inventories of radar grid data from the A-II database. The data is +# output to stdout as ASCII. Inventories are limited to Radial and Raster +# formats. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-27 3600 nabowle Initial modification. Convert to DAF. +# 2014-12-18 3600 nabowle Use new getAvailableLevels() to speed up retrieval. +# + +import argparse +import numpy +import sys + +from datetime import datetime +from datetime import timedelta + +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.level import Level + + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", metavar="hostname") + + parser.add_argument("--icao", action="store", dest="icao", + help="The ICAO (optional)", metavar="icao") + + parser.add_argument("--productCode", action="store", dest="productCode", + help="Product Code (optional)", metavar="productCode") + + parser.add_argument("--angle", action="store", dest="angle", type=float, + help="The Primary Elevation Angle (optional)", + metavar="angle") + + parser.add_argument("--date", action="store", dest="date", + help="A date to find data within a minute of. (optional, --time required if provided)", + metavar="YYYY-MM-DD") + + parser.add_argument("--time", action="store", dest="time", + help="A time to find data within a minute of. (optional, --date required if provided)", + metavar="HH:MM") + + parser.add_argument("--outputDate", action="store_true", + dest="outputDate", help="Output the datetime (optional)") + + parser.add_argument("--outputTrue", action="store_const", + dest="outputAngle", const="true", + help="Output true elevation angle, if relevant. (optional," + + " exclusive with --outputPrimary)") + + parser.add_argument("--outputPrimary", action="store_const", + dest="outputAngle", const="primary", + help="Output primary elevation angle, if relevant. " + + "(optional, exclusive with --outputTrue)") + return parser.parse_args() + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + if (user_args.date and not user_args.time) or (user_args.time and not user_args.date): + print >> sys.stderr, "date and time must be provided together" + return + + # If a time range is provided, results will be filtered based on available times + timeRange = None + if user_args.date: + midRange = datetime.strptime( user_args.date + " " + user_args.time, "%Y-%m-%d %H:%M") + beginRange = midRange - timedelta(0, 60) + endRange = midRange + timedelta(0, 60) + timeRange = TimeRange(beginRange, endRange) + + req = create_request(user_args) + if user_args.icao: + if user_args.productCode: # retrieve available times and/or true or primary elevation angles + if timeRange: + tr = timeRange + else: + tr = None + lines = set() + + if user_args.outputAngle: + levels = DataAccessLayer.getAvailableLevels(req) + for level in levels: + line = "" + req.setLevels(level) + if user_args.outputDate: + times = DataAccessLayer.getAvailableTimes(req) + for time in times: + if not tr or tr.contains(time.getValidPeriod()): + line = str(time) + ".0" + line += " " + if user_args.outputAngle == "true": + line += "%.1f"%level.getLeveltwovalue() + else: + line += "%.1f"%level.getLevelonevalue() + lines.add(line) + else: + if not tr or data_in_time_range(req, tr): + if user_args.outputAngle == "true": + line = "%.1f"%level.getLeveltwovalue() + else: + line = "%.1f"%level.getLevelonevalue() + lines.add(line) + else : # just output time + times = DataAccessLayer.getAvailableTimes(req) + for time in times: + if not tr or tr.contains(time.getValidPeriod()): + lines.add(str(time) + ".0") + msg = "\n".join(lines) + else: #retrieve available product codes + unfiltered = DataAccessLayer.getAvailableParameters(req) + productCodes = [] + for parameter in unfiltered: #filter to just productCodes + if parameter.isdigit(): + productCodes.append(parameter) + if timeRange: + unfiltered = productCodes + productCodes = [] + for productCode in unfiltered: + req = create_request(user_args) + req.setParameters(productCode) + if data_in_time_range(req, timeRange): + productCodes.append(productCode) + msg = "\n".join(productCodes) + + else: # retrieve available icaos + icaos = DataAccessLayer.getAvailableLocationNames(req) + if timeRange: + unfiltered = icaos + icaos = [] + for icao in unfiltered: + req = create_request(user_args) + req.addIdentifier("icao", icao) + if data_in_time_range(req, timeRange): + icaos.append(icao) + + msg = "\n".join(icaos) + + print msg.strip() + +def create_request(user_args): + req = DataAccessLayer.newDataRequest("radar") + if user_args.icao: + req.addIdentifier("icao", user_args.icao) + if user_args.productCode: + req.setParameters(user_args.productCode) + if user_args.angle is not None: + level = Level() + level.setLevelonevalue(user_args.angle) + req.setLevels(level) + # Indicate that when providing or requesting levels, the Levelonevalue + # is the primaryElevationAngle and the Leveltwovalue value is the + # trueElevationAngle + req.addIdentifier("level.one.field", "primaryElevationAngle") + req.addIdentifier("level.two.field", "trueElevationAngle") + + return req + +def data_in_time_range(req, timeRange): + times = DataAccessLayer.getAvailableTimes(req) + for time in times: + if timeRange.contains(time.getValidPeriod()): + return True + return False + +if __name__ == '__main__': + main() diff --git a/data/radar/a2radcommon.py b/data/radar/a2radcommon.py new file mode 100644 index 0000000..1200261 --- /dev/null +++ b/data/radar/a2radcommon.py @@ -0,0 +1,251 @@ +## +# 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. +## + +# +# Common methods for the a2gtrad and a2advrad scripts. +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 08/13/2014 3393 nabowle Initial creation to contain common +# code for a2*radStub scripts. +# +# + +import argparse +import sys + +from datetime import datetime +from datetime import timedelta +from ufpy import ThriftClient + +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.level import Level +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.radar.request import GetRadarDataRecordRequest + +def get_default_host(): + from ufpy.dataaccess import DataAccessLayer + return DataAccessLayer.THRIFT_HOST + + +def get_args_parser(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("--host", action="store", dest="host", + help="EDEX server hostname", + metavar="hostname") + parser.add_argument("--datetime", action="store", dest="datetime", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="datetime") + parser.add_argument("--radar", action="store", dest="radar", + help="The ICAO code for the radar", + metavar="radar") + parser.add_argument("--code", action="store", dest="code", + help="The product code.", type=int, + metavar="code") + parser.add_argument("--angle", action="store", dest="angle", default=0, + help="The Elevation Angle", metavar="angle") + parser.add_argument("--description", action="store", dest="description", + help="The description.", + metavar="desc") + parser.add_argument("--slop", action="store", dest="slop", default=60, + help="The amount of slop, in seconds, to allow around the datetime.", + metavar="slop", type=int) + return parser + + +def send_request(user_args): + slop = user_args.slop + + dateTimeStr = user_args.datetime + if not dateTimeStr: + print >> sys.stderr, "DateTime not provided" + return + dateTime = datetime.strptime(dateTimeStr, "%Y-%m-%d %H:%M") + beginRange = dateTime - timedelta(0, slop) + endRange = dateTime + timedelta(0, slop) + + timerange = TimeRange(beginRange, endRange) + + radar = user_args.radar + if not radar: + print >> sys.stderr, "Radar code not provided" + return + + code = user_args.code + if not code: + print >> sys.stderr, "Product code not provided" + return + + angle = user_args.angle + + slop = int(user_args.slop) + + host = user_args.host + if not host: + host = get_default_host() + + client = ThriftClient.ThriftClient(host) + + # Perform a GetRadarHDF5Request + req = GetRadarDataRecordRequest() + req.setRadarId(radar) + req.setPrimaryElevationAngle(float(angle)) + req.setTimeRange(timerange) + req.setProductCode(int(code)) + + response = client.sendRequest(req) + + if response is None: + # print "Data not available" + return + + records = response.getData() + return records + + +def get_datetime_str(record): + #2014-07-16 00:00:00 (0) => 2014-07-16_00:03:00.0 + return str(record.getDataTime())[0:19].replace(" ","_") + ".0" + + +def get_data_type(azdat): + if azdat: + dattyp = "radial" + else : + dattyp = "raster" + return dattyp + + +def get_hdf5_data(idra): + rdat = [] + azdat = [] + depVals = [] + threshVals = [] + if len(idra) > 0: + for ii in range(len(idra)): + if idra[ii].getName() == "Data": + rdat = idra[ii] + elif idra[ii].getName() == "Angles": + azdat = idra[ii] + dattyp = "radial" + elif idra[ii].getName() == "DependentValues": + depVals = idra[ii].getShortData() +## Commented out from the original. May not be available. +# elif idra[ii].getName() == "ProductVals": +# prodVals = idra[ii].getByteData() +# elif idra[ii].getName() == "RecordVals": +# recVals = idra[ii].getByteData() +# elif idra[ii].getName() == "StormIds": +# stormVals = idra[ii].getByteData() +# elif idra[ii].getName() == "Symbology": +# symVals = idra[ii].getByteData() +# elif idra[ii].getName() == "SymbologyData": +# symData = idra[ii].getByteData() +## + elif idra[ii].getName() == "Thresholds": + threshVals = idra[ii].getShortData() + + return rdat,azdat,depVals,threshVals + + +def get_header(record, format, xLen, yLen, azdat, description): + # Encode dimensions, time, mapping, description, tilt, and VCP + mytime = get_datetime_str(record) + dattyp = get_data_type(azdat) + + if format : + msg = str(xLen) + " " + str(yLen) + " " + mytime + " " + \ + dattyp + " " + str(record.getLatitude()) + " " + \ + str(record.getLongitude()) + " " + \ + str(record.getElevation()) + " " + \ + str(record.getElevationNumber()) + " " + \ + description + " " + str(record.getTrueElevationAngle()) + " " + \ + str(record.getVolumeCoveragePattern()) + "\n" +#"%.1f"% + else : + msg = str(xLen) + " " + str(yLen) + " " + mytime + " " + \ + dattyp + " " + description + " " + \ + str(record.getTrueElevationAngle()) + " " + \ + str(record.getVolumeCoveragePattern()) + "\n" + + return msg + + +def encode_thresh_vals(threshVals): + spec = [".", "TH", "ND", "RF", "BI", "GC", "IC", "GR", "WS", "DS", + "RA", "HR", "BD", "HA", "UK"] + nnn = len(threshVals) + j = 0 + msg = "" + while j 14 : + msg += "." + else : + msg += spec[lo] + continue + if hi % 16 >= 8 : + msg += ">" + elif hi % 8 >= 4 : + msg += "<" + if hi % 4 >= 2 : + msg += "+" + elif hi % 2 >= 1 : + msg += "-" + if hi >= 64 : + msg += "%.2f"%(lo*0.01) + elif hi % 64 >= 32 : + msg += "%.2f"%(lo*0.05) + elif hi % 32 >= 16 : + msg += "%.1f"%(lo*0.1) + else : + msg += str(lo) + msg += "\n" + return msg + + +def encode_dep_vals(depVals): + nnn = len(depVals) + j = 0 + msg = "" + while j& /dev/null +if ( $status == 0 ) then +# Replace first field with station names substitutions in wmoToNameRaob.txt or +# with what's stored in the database. They are similar but do not match 100%. + /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" | sed -f $staInf +# /awips2/python/bin/python $stubpy -b "$1 $2" -e "$3 $4" --use-station-name +else + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set specpy = /tmp/a2gtraob${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + cat $stubpy | sed "s/BBBBB/$1 $2/g" | sed "s/EEEEE/$3 $4/g" > $specpy + + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | sed -n '2,$p' | \ + sed -f $staInf + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + diff --git a/data/raobs/a2gtraobStub.py b/data/raobs/a2gtraobStub.py new file mode 100644 index 0000000..ff5bb2e --- /dev/null +++ b/data/raobs/a2gtraobStub.py @@ -0,0 +1,338 @@ +## +# 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. +## + +# Gets all available raob data in the A-II database over a specified range of +# times. The data is output to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# Oct 10, 2014 3595 nabowle Initial modification. Fix Man and SigW indices. +# Oct 10, 2014 3595 nabowle Replace UEngine with DAF. +# +# + +import argparse +import sys + +from datetime import datetime +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("-b", action="store", dest="start", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="start") + parser.add_argument("-e", action="store", dest="end", + help="The end of the time range in YYYY-MM-DD HH:MM", + metavar="end") + parser.add_argument("--use-station-name", action='store_true', default=False, + dest="stationname", help="Output the station name instead of station id for the first output field.") + return parser.parse_args() + +def main(): + # The multi-dimensional parameters. + MAN_PARAMS = set(['prMan', 'htMan', 'tpMan', 'tdMan', 'wdMan', 'wsMan']) + TROP_PARAMS = set(['prTrop', 'tpTrop', 'tdTrop', 'wdTrop', 'wsTrop']) + MAXW_PARAMS = set(['prMaxW', 'wdMaxW', 'wsMaxW']) + SIGT_PARAMS = set(['prSigT', 'tpSigT', 'tdSigT']) + SIGW_PARAMS = set(['htSigW', 'wdSigW', 'wsSigW']) + + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + start = user_args.start + end = user_args.end + + if not start or not end: + print >> sys.stderr, "Start or End date not provided" + return + + beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f") + endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f") + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("bufrua") + req.setParameters("wmoStaNum", "validTime", "rptType", "staElev", "numMand", + "numSigT", "numSigW", "numTrop", "numMwnd", "staName") + req.getParameters().extend(MAN_PARAMS) + req.getParameters().extend(TROP_PARAMS) + req.getParameters().extend(MAXW_PARAMS) + req.getParameters().extend(SIGT_PARAMS) + req.getParameters().extend(SIGW_PARAMS) + + geometries = DataAccessLayer.getGeometryData(req, timerange) + + if not geometries : +# print "couldn't get data" + return + + + manGeos = [] + tropGeos = [] + maxwGeos = [] + sigtGeos = [] + sigwGeos = [] + # D-2D format files expect depression + tdman = [] + tdsigt = [] + tdtrop = [] + msg = "" + for geoData in geometries : + if set(geoData.getParameters()) & MAN_PARAMS : + manGeos.append(geoData) + td = geoData.getNumber("tdMan") + tp = geoData.getNumber("tpMan") + if td >150 and td<=tp : + tdman.append(tp-td) + else : + tdman.append(-9999.0) + continue + if set(geoData.getParameters()) & TROP_PARAMS : + tropGeos.append(geoData) + td = geoData.getNumber("tdTrop") + tp = geoData.getNumber("tpTrop") + if td>150 and td<=tp : + tdtrop.append(tp-td) + else : + tdtrop.append(-9999.0) + continue + if set(geoData.getParameters()) & MAXW_PARAMS : + maxwGeos.append(geoData) + continue + if set(geoData.getParameters()) & SIGT_PARAMS : + sigtGeos.append(geoData) + td = geoData.getNumber("tdSigT") + tp = geoData.getNumber("tpSigT") + if td>150 and td<=tp : + tdsigt.append(tp-td) + else : + tdsigt.append(-9999.0) + continue + if set(geoData.getParameters()) & SIGW_PARAMS : + sigwGeos.append(geoData) + continue + + if len(manGeos) == 0 and len(sigtGeos) == 0 and len(sigwGeos) == 0 or geoData.getNumber("rptType") > 2022 : + manGeos = [] + tropGeos = [] + maxwGeos = [] + sigtGeos = [] + sigwGeos = [] + tdman = [] + tdsigt = [] + tdtrop = [] + continue + + if user_args.stationname and geoData.getString("staName") : + msg += geoData.getString("staName") + "," + else : + msg += geoData.getString("wmoStaNum") + "," + msg += str(geoData.getNumber("validTime")/1000) + "," + msg += "%.4f"%geoData.getGeometry().y + "," + msg += "%.4f"%geoData.getGeometry().x + "," + msg += "%.0f"%geoData.getNumber("staElev") + "," + msg += geoData.getString("wmoStaNum") + "," + + kk = len(manGeos) + msg += str(kk) + "," + if kk>0 : + msg += "%.1f"%manGeos[0].getNumber("prMan") + k = 1 + while k < kk : + msg += "|" + "%.1f"%manGeos[k].getNumber("prMan") + k += 1 + msg += "," + + msg += "%.1f"%geoData.getNumber("staElev") + k = 1 + while k < kk : + msg += "|" + "%.1f"%manGeos[k].getNumber("htMan") + k += 1 + msg += "," + + msg += "%.1f"%manGeos[0].getNumber("tpMan") + k = 1 + while k < kk : + msg += "|" + "%.1f"%manGeos[k].getNumber("tpMan") + k += 1 + msg += "," + + msg += "%.1f"%tdman[0] + k = 1 + while k < kk : + msg += "|" + "%.1f"%tdman[k]; + k += 1 + msg += "," + + msg += "%.1f"%manGeos[0].getNumber("wsMan") + k = 1 + while k < kk : + msg += "|" + "%.1f"%manGeos[k].getNumber("wsMan") + k += 1 + msg += "," + + msg += "%.1f"%manGeos[0].getNumber("wdMan") + k = 1 + while k < kk : + msg += "|" + "%.1f"%manGeos[k].getNumber("wdMan") + k += 1 + msg += "," + else : + msg += ",,,,,," + + kk = len(sigtGeos) + msg += str(kk) + "," + if kk>0 : + msg += "%.1f"%sigtGeos[0].getNumber("prSigT") + k = 1 + while k < kk : + msg += "|" + "%.1f"%sigtGeos[k].getNumber("prSigT") + k += 1 + msg += "," + + msg += "%.1f"%sigtGeos[0].getNumber("tpSigT") + k = 1 + while k < kk : + msg += "|" + "%.1f"%sigtGeos[k].getNumber("tpSigT") + k += 1 + msg += "," + + msg += "%.1f"%tdsigt[0] + k = 1 + while k < kk : + msg += "|" + "%.1f"%tdsigt[k] + k += 1 + msg += "," + else : + msg += ",,," + + kk = len(sigwGeos) + msg += str(kk) + "," + if kk>0 : + msg += "%.1f"%sigwGeos[0].getNumber("htSigW") + k = 1 + while k < kk : + msg += "|" + "%.1f"%sigwGeos[k].getNumber("htSigW") + k += 1 + msg += "," + + msg += "%.1f"%sigwGeos[0].getNumber("wsSigW") + k = 1 + while k < kk : + msg += "|" + "%.1f"%sigwGeos[k].getNumber("wsSigW") + k += 1 + msg += "," + + msg += "%.1f"%sigwGeos[0].getNumber("wdSigW") + k = 1 + while k < kk : + msg += "|" + "%.1f"%sigwGeos[k].getNumber("wdSigW") + k += 1 + msg += "," + else : + msg += ",,," + + kk = len(tropGeos) + msg += str(kk) + "," + if kk>0 : + msg += "%.1f"%tropGeos[0].getNumber("prTrop") + k = 1 + while k < kk : + msg += "|" + "%.1f"%tropGeos[k].getNumber("prTrop") + k += 1 + msg += "," + + msg += "%.1f"%tropGeos[0].getNumber("tpTrop") + k = 1 + while k < kk : + msg += "|" + "%.1f"%tropGeos[k].getNumber("tpTrop") + k += 1 + msg += "," + + msg += "%.1f"%tdtrop[0] + k = 1 + while k < kk : + msg += "|" + "%.1f"%tdtrop[k] + k += 1 + msg += "," + + msg += "%.1f"%tropGeos[0].getNumber("wsTrop") + k = 1 + while k < kk : + msg += "|" + "%.1f"%tropGeos[k].getNumber("wsTrop") + k += 1 + msg += "," + + msg += "%.1f"%tropGeos[0].getNumber("wdTrop") + k = 1 + while k < kk : + msg += "|" + "%.1f"%tropGeos[k].getNumber("wdTrop") + k += 1 + msg += "," + else : + msg += ",,,,," + + kk = len(maxwGeos) + msg += str(kk) + "," + if kk>0 : + msg += "%.1f"%maxwGeos[0].getNumber("prMaxW") + k = 1 + while k < kk : + msg += "|" + "%.1f"%maxwGeos[k].getNumber("prMaxW") + k += 1 + msg += "," + + msg += "%.1f"%maxwGeos[0].getNumber("wsMaxW") + k = 1 + while k < kk : + msg += "|" + "%.1f"%maxwGeos[k].getNumber("wsMaxW") + k += 1 + msg += "," + + msg += "%.1f"%maxwGeos[0].getNumber("wdMaxW") + k = 1 + while k < kk : + msg += "|" + "%.1f"%maxwGeos[k].getNumber("wdMaxW") + k += 1 + else : + msg += ",," + msg += "\n" + + manGeos = [] + tropGeos = [] + maxwGeos = [] + sigtGeos = [] + sigwGeos = [] + tdman = [] + tdsigt = [] + tdtrop = [] + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/satellite/a2invsat.csh b/data/satellite/a2invsat.csh new file mode 100644 index 0000000..e3c47f8 --- /dev/null +++ b/data/satellite/a2invsat.csh @@ -0,0 +1,174 @@ +#!/bin/csh +## +# 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. +## +# +# A script wrapper that is meant to get inventories of satellite data +# from the A-II database. The data is output to stdout as ASCII. +# This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2invsat.csh {p} sector channel {satid} +# +# p - A literal p. (optional) +# sector - sector id +# channel - channel id +# satid - (optional) satellite id +# +# Returns a list of times with data for the specified sector/channel. +# +# The ids can be either D-2D integer ids, or AWIPS-II ascii ids, in which +# case they need to be quoted on the command line. +# +# Integer ids can be looked up in a2satInfo.txt, channel id corresponds to +# the physicalElement, and satid corresponds to the creatingEntity. +# +# The literal p option means preserve the final version of the python +# submitted to the UEngine instead of cleaning it up. The path to the +# finalized python is /tmp/a2invsatNNNNN.py where NNNNN is a unix process id. +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-23 3601 nabowle Initial modification. Properly calls DAF. Make a2satInfo.txt optional. +# + +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./a2invsatStub.py ) then + set stubpy = ./a2invsatStub.py +else if ( -e $mydir/a2invsatStub.py ) then + set stubpy = $mydir/a2invsatStub.py +else if ( -e $FXA_HOME/src/dm/sat/a2invsatStub.py ) then + set stubpy = $FXA_HOME/src/dm/sat/a2invsatStub.py +else if ( -e $FXA_HOME/bin/a2invsatStub.py ) then + set stubpy = $FXA_HOME/bin/a2invsatStub.py +else + bash -c "echo could not find a2invsatStub.py 1>&2" + exit +endif + +# +# Locate file containing mapping between D-2D interger ids and AWIPS-II ascii +# ids for sectors, channels, and satellites. +# +if ( -e ./a2satInfo.txt ) then + set satInf = ./a2satInfo.txt +else if ( -e $mydir/a2satInfo.txt ) then + set satInf = $mydir/a2satInfo.txt +else if ( -e $FXA_HOME/src/dm/sat/a2satInfo.txt ) then + set satInf = $FXA_HOME/src/dm/sat/a2satInfo.txt +else if ( -e $FXA_HOME/data/a2satInfo.txt ) then + set satInf = $FXA_HOME/data/a2satInfo.txt +else + set satInf = "" + set sss = "$1" + set ccc = "$2" + if ( "$3" == "" ) then + set eee = "" + else + set eee = "$3" + endif +endif +# +# +if ( $satInf != "" ) then + set sss = `grep "^ *$1|.*sectorID" $satInf | cut '-d|' -f3` + if ( "$sss" == "" ) set sss = "$1" + set ccc = `grep "^ *$2|.*physicalElement" $satInf | cut '-d|' -f3` + if ( "$ccc" == "" ) set ccc = "$2" + if ( "$3" == "" ) then + set eee = "" + else + set eee = `grep "^ *$3|.*creatingEntity" $satInf | cut '-d|' -f3` + if ( "$eee" == "" ) set eee = "$3" + endif +endif + +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + if ( "$eee" == "" ) then + /awips2/python/bin/python $stubpy --sectorID "$sss" --physicalElement "$ccc" + else + /awips2/python/bin/python $stubpy --sectorID "$sss" --physicalElement "$ccc" --creatingEntity "$eee" + endif +else + # + # Set up the environment we need to run the UEngine. + # + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + # + # Modify the text of special tags in stub to create finalized script. + # + set specpy = /tmp/a2invsat${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + if ( "$eee" == "" ) then + cat $stubpy | sed "s/SSSSS/$sss/g" | sed "s/CCCCC/$ccc/g" | \ + sed 's/^.*EEEEE.*$//g' >> $specpy + else + cat $stubpy | sed "s/SSSSS/$sss/g" | sed "s/CCCCC/$ccc/g" | \ + sed "s/EEEEE/$eee/g" >> $specpy + endif + + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) |& grep attributes | cut '-d"' -f4 + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null +endif + diff --git a/data/satellite/a2invsatStub.py b/data/satellite/a2invsatStub.py new file mode 100644 index 0000000..fcd4fc8 --- /dev/null +++ b/data/satellite/a2invsatStub.py @@ -0,0 +1,76 @@ +## +# 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. +## + +# Gets inventories of satellite data from the A-II database. The data is output +# to stdout as ASCII. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 2014-10-23 3601 nabowle Initial modification. Convert to DAF. +# + +import argparse +import numpy +import sys + +from ufpy.dataaccess import DataAccessLayer + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", metavar="hostname") + parser.add_argument("--sectorID", action="store", dest="sectorID", + help="The sector ID.", metavar="sectorID") + parser.add_argument("--physicalElement", action="store", dest="physicalElement", + help="The physical element.", metavar="physicalElement") + parser.add_argument("--creatingEntity", action="store", dest="creatingEntity", + help="(optional) The creating entity", metavar="creatingEntity") + + return parser.parse_args() + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + req = DataAccessLayer.newDataRequest("satellite") + + if not user_args.sectorID or not user_args.physicalElement: + print >> sys.stderr, "sectorID or physicalElement not provided" + return + req.setParameters(user_args.physicalElement) + req.addIdentifier("sectorID", user_args.sectorID) + + if user_args.creatingEntity: + req.addIdentifier("creatingEntity", user_args.creatingEntity) + + msg = ""; + times = DataAccessLayer.getAvailableTimes(req) + for time in times: + timeStr = str(time) + msg += timeStr[0:19] + ".0" + timeStr[19:] + "\n" + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/data/satellite/a2rdsat.csh b/data/satellite/a2rdsat.csh new file mode 100644 index 0000000..96bab07 --- /dev/null +++ b/data/satellite/a2rdsat.csh @@ -0,0 +1,243 @@ +#!/bin/csh +## +# 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. +## +# +# A script wrapper that is meant to get data for a single satellite sector +# from the A-II database. The result is output to stdout as ASCII. +# The first line returned has the dimensions of the image, the time, and the +# source satellite of the data set returned. The rest is one line per row +# of satellite data. The data for each row undergoes second order compression +# Each pixel value of 0 or 255 is encoded as @ or #, respectively. Otherwise +# the first pixel on the row and any pixel that is more than 20 counts +# different than the previous one is encoded as two hex digits. Pixels the +# same as the previous are encoded as a period, pixels from 1 to 20 counts less +# than the previous are encoded as G through Z, and pixels from 1 to 20 counts +# more than the previous are encoded as g through z. There are no delimeters +# between the encoding for each pixel. +# +# This version can adapt to use a python stub that calls the +# data access framework. +# +# Usage: +# +# a2rdsat.csh {p} {h|i} sector channel {satid} date time {slop} {partition} +# +# p - (optional) A literal p. +# h|i - (optional) A literal h or literal i. +# Output pure undelimited hex or delimited integer values. +# sector - sector id +# channel - channel id +# satid - (optional) satellite id +# date - yyyy-mm-dd +# time - hh:mm +# slop - seconds of slop either side, defaults to 180 +# partition - (optional) upper case letter indicating partition to get. For +# very large images data may need to be returned in pieces. +# Allowable partitions are A through D. +# +# The ids can be either D-2D integer ids, or AWIPS-II ascii ids, in which +# case they may need to be quoted on the command line. +# +# Integer ids can be looked up in a2satInfo.txt, channel id corresponds to +# the physicalElement, and satid corresponds to the creatingEntity. +# +# The literal p option means preserve the final version of the python +# submitted to the UEngine instead of cleaning it up. The path to the +# finalized python is /tmp/a2rdsatNNNNN.py where NNNNN is a unix process id. +# The literal n option means the first line of output is the dimension of +# the grid returned. +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# Sep 29, 2014 3596 nabowle Initial modification. Handle daf conversion. +# +# +# +set rmpy = yes +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +set encoding = 2 +if ( "$1" == "h" ) then + set encoding = 1 + shift +endif +if ( "$1" == "i" ) then + set encoding = 0 + shift +endif +if ( "$1" == "p" ) then + set rmpy = no + shift +endif +# +# Identify directory this script is in, will be one of the directories we +# search for other files in. +# +set mydir = `dirname $0` +set d1 = `echo $mydir | cut -c1` +if ( "$mydir" == '.' ) then + set mydir = $PWD +else if ( "$d1" != "/" ) then + set mydir = $PWD/$mydir +endif +set mydir = `(cd $mydir ; pwd)` +if ( ! $?FXA_HOME ) set FXA_HOME = xxxx +# +# Locate python stub that we will modify to create the final python logic. +# +if ( -e ./a2rdsatStub.py ) then + set stubpy = ./a2rdsatStub.py +else if ( -e $mydir/a2rdsatStub.py ) then + set stubpy = $mydir/a2rdsatStub.py +else if ( -e $FXA_HOME/src/dm/sat/a2rdsatStub.py ) then + set stubpy = $FXA_HOME/src/dm/sat/a2rdsatStub.py +else if ( -e $FXA_HOME/bin/a2rdsatStub.py ) then + set stubpy = $FXA_HOME/bin/a2rdsatStub.py +else + bash -c "echo could not find a2rdsatStub.py 1>&2" + exit +endif + + +# +# Locate file containing mapping between D-2D interger ids and AWIPS-II ascii +# ids for sectors, channels, and satellites. +# +if ( -e ./a2satInfo.txt ) then + set satInf = ./a2satInfo.txt +else if ( -e $mydir/a2satInfo.txt ) then + set satInf = $mydir/a2satInfo.txt +else if ( -e $FXA_HOME/src/dm/sat/a2satInfo.txt ) then + set satInf = $FXA_HOME/src/dm/sat/a2satInfo.txt +else if ( -e $FXA_HOME/data/a2satInfo.txt ) then + set satInf = $FXA_HOME/data/a2satInfo.txt +else + set satInf = "" + set sss = "$1" + set ccc = "$2" + set eee = `echo $3 | grep -v '.*-'` +endif +# +# +if ( $satInf != "" ) then + set sss = `grep "^ *$1|.*sectorID" $satInf | cut '-d|' -f3` + if ( "$sss" == "" ) set sss = "$1" + set ccc = `grep "^ *$2|.*physicalElement" $satInf | cut '-d|' -f3` + if ( "$ccc" == "" ) set ccc = "$2" + set eee = `echo $3 | grep -v '.*-'` + if ( "$eee" != "" ) then + set eee = `grep "^ *$eee|.*creatingEntity" $satInf | cut '-d|' -f3` + if ( "$eee" == "" ) set eee = "$3" + endif +endif + +shift +shift + +if ( "$eee" != "" ) shift +set slop = `echo $3 | grep '[0-9]'` +if ( "$slop" == "" ) set slop = 180 + +set ppp = `echo $argv[$#argv] | grep '^[A-Z]$'` +if ( "$ppp" == "" ) set ppp = 0 + +# +# Determine if we are using the data access framework or the uEngine. +# +grep DataAccessLayer $stubpy >& /dev/null +if ( $status == 0 ) then + set opts = "" + if ( "$eee" != "" ) then + set opts = "--entity ${eee}" + endif + + if ( "$encoding" == "1" ) then + set opts = "$opts --hex" + else if ( "$encoding" == "0" ) then + set opts = "$opts --int" + endif + + /awips2/python/bin/python $stubpy --sector "${sss}" --physical "${ccc}" --datetime "$1 $2" --part $ppp --slop $slop $opts +else + # + # Get program that can do math with ascii time string, then use this to + # properly encode range of times for which we look for data. + # + if ( -x ./gtasUtil ) then + set gtasUtil = ./gtasUtil + else if ( -x $mydir/gtasUtil ) then + set gtasUtil = $mydir/gtasUtil + else if ( -x $FXA_HOME/src/dm/point/gtasUtil ) then + set gtasUtil = $FXA_HOME/src/dm/point/gtasUtil + else if ( -x $FXA_HOME/bin/gtasUtil ) then + set gtasUtil = $FXA_HOME/bin/gtasUtil + else + bash -c "echo could not find gtasUtil executable 1>&2" + exit + endif + + # + # Set up the environment we need to run the UEngine. + # + set method = "uengine" + if ( -e ./UEngine.cshsrc ) then + set ueenv = ./UEngine.cshsrc + else if ( -e $mydir/UEngine.cshsrc ) then + set ueenv = $mydir/UEngine.cshsrc + else if ( -e $FXA_HOME/src/dm/point/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/src/dm/point/UEngine.cshsrc + else if ( -e $FXA_HOME/bin/UEngine.cshsrc ) then + set ueenv = $FXA_HOME/bin/UEngine.cshsrc + else + bash -c "echo could not find UEngine.cshsrc 1>&2" + exit + endif + source $ueenv + + set aaa = `$gtasUtil = $1 $2 -$slop` + set bbb = `$gtasUtil = $1 $2 $slop` + + set specpy = /tmp/a2rdsat${$}.py + rm -rf $specpy >& /dev/null + touch $specpy + chmod 775 $specpy + if ( "$eee" == "" ) then + cat $stubpy | sed "s/SSSSS/$sss/g" | sed "s/CCCCC/$ccc/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | \ + sed 's/^.*EEEEE.*$//g'| sed "s/PPPPP/$ppp/g" | \ + sed "s/XXXXX/$encoding/g" >> $specpy + else + cat $stubpy | sed "s/SSSSS/$sss/g" | sed "s/CCCCC/$ccc/g" | \ + sed "s/AAAAA/$aaa/g" | sed "s/BBBBB/$bbb/g" | \ + sed "s/EEEEE/$eee/g" | sed "s/PPPPP/$ppp/g" | \ + sed "s/XXXXX/$encoding/g" >> $specpy + endif + + cd $UE_BIN_PATH + ( uengine -r python < $specpy ) | grep -v '<' | grep -v Response + + if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null + # +endif diff --git a/data/satellite/a2rdsatStub.py b/data/satellite/a2rdsatStub.py new file mode 100644 index 0000000..4ee8b1a --- /dev/null +++ b/data/satellite/a2rdsatStub.py @@ -0,0 +1,227 @@ +## +# 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. +## + +# Gets data for a single satellite sector from the A-II database. The result is +# output to stdout as ASCII. The first line returned has the dimensions of the +# image, the time, and the source satellite of the data set returned. The rest +# is one line per row of satellite data. The data for each row undergoes second +# order compression Each pixel value of 0 or 255 is encoded as @ or #, +# respectively. Otherwise the first pixel on the row and any pixel that is more +# than 20 counts different than the previous one is encoded as two hex digits. +# Pixels the same as the previous are encoded as a period, pixels from 1 to 20 +# counts less than the previous are encoded as G through Z, and pixels from 1 to +# 20 counts more than the previous are encoded as g through z. There are no +# delimeters between the encoding for each pixel. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# Sep 29, 2014 3596 nabowle Initial modification. Replace UEngine with DAF. +# +# + +import a2dafcommon +import argparse +import sys + +from datetime import datetime +from datetime import timedelta +from ufpy.dataaccess import DataAccessLayer +from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange + +def get_args(): + parser = argparse.ArgumentParser(conflict_handler="resolve") + parser.add_argument("-h", action="store", dest="host", + help="EDEX server hostname (optional)", + metavar="hostname") + parser.add_argument("--datetime", action="store", dest="datetime", + help="The start of the time range in YYYY-MM-DD HH:MM", + metavar="datetime") + parser.add_argument("--slop", action="store", dest="slop", default=180, + help="The amount of slop, in seconds, to allow around the datetime.", + metavar="slop", type=int) + parser.add_argument("--sector", action="store", dest="sector", + help="The sector ID.", metavar="sectorID") + parser.add_argument("--physical", action="store", dest="physical", + help="The physical element.", metavar="physicalElement") + parser.add_argument("--entity", action="store", dest="entity", + help="The creating entity (optional)", + metavar="creatingEntity") + parser.add_argument("--partition", action="store", dest="partition", + help="Upper case letter indicating partition to get.", + metavar="partition", default="0") + parser.add_argument("--hex", action='store_const', dest="encoding", + const=1, help="Hex encoding.", metavar="encoding") + parser.add_argument("--int", action='store_const', dest="encoding", + const=0, help="Delimited integer encoding.", + metavar="encoding") + return parser.parse_args() + + +def main(): + user_args = get_args() + + if user_args.host: + DataAccessLayer.changeEDEXHost(user_args.host) + + slop = user_args.slop + + dateTimeStr = user_args.datetime + if not dateTimeStr: + print >> sys.stderr, "DateTime not provided" + return + + physicalElement = user_args.physical + if not physicalElement: + print >> sys.stderr, "PhysicalElement not provided" + return + + sectorID = user_args.sector + if not sectorID: + print >> sys.stderr, "SectorID not provided" + return + + creatingEntity = user_args.entity + part = user_args.partition + encoding = user_args.encoding + + dateTime = datetime.strptime(dateTimeStr, "%Y-%m-%d %H:%M") + beginRange = dateTime - timedelta(0, slop) + endRange = dateTime + timedelta(0, slop) + + timerange = TimeRange(beginRange, endRange) + + req = DataAccessLayer.newDataRequest("satellite") + req.setParameters(physicalElement) + req.setLocationNames(sectorID) + + if creatingEntity: + req.addIdentifier("creatingEntity", creatingEntity) + + grids = DataAccessLayer.getGridData(req, timerange) + + if not grids: +# print "Data not available" + return + + grid = grids[0] + data = grid.getRawData() + myent = grid.getAttribute("creatingEntity") + mytime = a2dafcommon.datatime_to_string(grid.getDataTime()) + ".0" + + if data is None or len(data) == 0: +# print "No data." + return + + yLen = len(data[0]) + xLen = len(data) + + plus = " ghijklmnopqrstuvwxyz" + minus = " GHIJKLMNOPQRSTUVWXYZ" + limit = 10000000 + if encoding == 1 : + limit = limit/2 + elif encoding == 0 : + limit = limit/8 + + k = xLen * ( yLen / 4 ) + j = 0 + nxy = yLen*xLen + if part=="D" : + j = k+k+k + elif part=="C" : + j = k+k + nxy = j+k + elif part=="B" : + j = k + nxy = j+k + elif part=="A" or nxy>limit : + nxy = k + + msg = "" + if part<="A" : + msg += str(xLen) + " " + str(yLen) + " " + msg += mytime + " " + myent + "\n" + + dataIdx = int(j / yLen) + arrIdx = j % yLen + arr = data[dataIdx] + i = 0 + kk = None + while j= yLen : + arrIdx = 0 + dataIdx += 1 + if dataIdx >= xLen: + break + arr = data[dataIdx] + while ikk+20 or kkk : + msg += plus[k-kk] + else : + msg += minus[kk-k] + kk = k + + arrIdx+=1 + i+=1 + if arrIdx >= yLen : + arrIdx = 0 + dataIdx += 1 + if dataIdx >= xLen: + break + arr = data[dataIdx] + + msg += "\n" + j+= xLen + + print msg.strip() + +if __name__ == '__main__': + main() diff --git a/setup.py b/setup.py index 946020a..531b386 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,10 @@ from distutils.core import setup +from setuptools import find_packages setup( name='ufpy', version='', - packages=['ufpy','ufpy.dataaccess',], + #packages=['ufpy','ufpy.dataaccess',], + packages=find_packages(exclude='data'), license='Creative Commons Attribution-Noncommercial-Share Alike license', )