diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.grid/src/com/raytheon/uf/common/dataplugin/grid/dataaccess/GridDataAccessFactory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.grid/src/com/raytheon/uf/common/dataplugin/grid/dataaccess/GridDataAccessFactory.java index a600fe7414..fd79fc6f91 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.grid/src/com/raytheon/uf/common/dataplugin/grid/dataaccess/GridDataAccessFactory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.grid/src/com/raytheon/uf/common/dataplugin/grid/dataaccess/GridDataAccessFactory.java @@ -1,19 +1,19 @@ /** * 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. **/ @@ -53,11 +53,11 @@ import com.raytheon.uf.common.util.mapping.Mapper; /** * Data access factory for accessing data from the Grid plugin as grid types. - * + * *
- * 
+ *
  * SOFTWARE HISTORY
- * 
+ *
  * Date          Ticket#  Engineer    Description
  * ------------- -------- ----------- --------------------------
  * Jan 17, 2013           bsteffen    Initial creation
@@ -66,10 +66,11 @@ import com.raytheon.uf.common.util.mapping.Mapper;
  * Feb 04, 2014  2672     bsteffen    Enable requesting subgrids.
  * Jul 30, 2014  3184     njensen     Renamed valid identifiers to optional
  * Sep 09, 2014  3356     njensen     Remove CommunicationException
- * 
- * 
+ * Oct 16, 2014  3598     nabowle     Accept level identifiers.
+ *
+ *
  * 
- * + * * @author bsteffen * @version 1.0 */ @@ -81,7 +82,9 @@ public class GridDataAccessFactory extends AbstractGridDataPluginFactory private static final String[] VALID_IDENTIFIERS = { GridConstants.DATASET_ID, GridConstants.SECONDARY_ID, - GridConstants.ENSEMBLE_ID, NAMESPACE }; + GridConstants.ENSEMBLE_ID, NAMESPACE, + GridConstants.MASTER_LEVEL_NAME, GridConstants.LEVEL_ONE, + GridConstants.LEVEL_TWO }; @Override public String[] getOptionalIdentifiers() { @@ -109,6 +112,9 @@ public class GridDataAccessFactory extends AbstractGridDataPluginFactory } if (request.getLevels() != null) { + checkForLevelConflict(request.getLevels(), + request.getIdentifiers()); + for (Level level : request.getLevels()) { assembler.setMasterLevelName(level.getMasterLevel() .getName()); @@ -152,6 +158,18 @@ public class GridDataAccessFactory extends AbstractGridDataPluginFactory assembler.setSecondaryId(identifiers.get( GridConstants.SECONDARY_ID).toString()); } + if (identifiers.containsKey(GridConstants.MASTER_LEVEL_NAME)) { + assembler.setMasterLevelName(identifiers.get( + GridConstants.MASTER_LEVEL_NAME).toString()); + } + if (identifiers.containsKey(GridConstants.LEVEL_ONE)) { + assembler.setLevelOneValue((Double) identifiers + .get(GridConstants.LEVEL_ONE)); + } + if (identifiers.containsKey(GridConstants.LEVEL_TWO)) { + assembler.setLevelTwoValue((Double) identifiers + .get(GridConstants.LEVEL_TWO)); + } } mergeConstraintMaps(assembler.getConstraintMap(), result); } catch (CommunicationException e) { @@ -160,10 +178,37 @@ public class GridDataAccessFactory extends AbstractGridDataPluginFactory return result; } + /** + * Check for possible level conflicts. + * + * @param levels + * The request levels. Assumed to not be null. + * @param identifiers + * The request identifiers. + * @throws DataRetrievalException + * if levels is not empty and at least one of the + * {@link GridConstants#MASTER_LEVEL_NAME}, + * {@link GridConstants#LEVEL_ONE}, or + * {@link GridConstants#LEVEL_TWO} identifiers is specified. + */ + private void checkForLevelConflict(Level[] levels, + Map identifiers) { + if (levels.length > 0 + && identifiers != null + && (identifiers.containsKey(GridConstants.MASTER_LEVEL_NAME) + || identifiers.containsKey(GridConstants.LEVEL_ONE) || identifiers + .containsKey(GridConstants.LEVEL_TWO))) { + throw new DataRetrievalException( + "Conflict between the request levels and request " + + "identifiers. Please set the levels either as" + + " identifiers or as levels, not both."); + } + } + /** * Copy all constraints from source to target. If target already contains a * constraint for a key then merge the values into target. - * + * * @param target * @param source */ diff --git a/pythonPackages/msaslaps/grid/a2rdmdl.csh b/pythonPackages/msaslaps/grid/a2rdmdl.csh index e6d0a39c4d..34b79a180e 100644 --- a/pythonPackages/msaslaps/grid/a2rdmdl.csh +++ b/pythonPackages/msaslaps/grid/a2rdmdl.csh @@ -1,4 +1,33 @@ #!/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. @@ -150,36 +179,10 @@ if ( $status == 0 || $#ids > 1 ) then endif set sss = $mmm endif -# -set rrrrr = "" + @ i = $#argv - 3 set vvvvv = $argv[$i] -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 + # # Locate python stub that we will modify to create the final python logic. # @@ -200,12 +203,25 @@ endif # grep DataAccessLayer $stubpy >& /dev/null if ( $status == 0 ) then - set method = "daf" + 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. # - set method = "uengine" if ( -e ./UEngine.cshsrc ) then set ueenv = ./UEngine.cshsrc else if ( -e $mydir/UEngine.cshsrc ) then @@ -219,47 +235,71 @@ else exit endif source $ueenv -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 -# -if ( "$method" == "daf" ) then - /awips2/python/bin/python $specpy -else + + 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 -if ( "$rmpy" == "yes" ) rm -rf $specpy >& /dev/null -# diff --git a/pythonPackages/msaslaps/grid/a2rdmdlCommon.py b/pythonPackages/msaslaps/grid/a2rdmdlCommon.py new file mode 100644 index 0000000000..fcc071880e --- /dev/null +++ b/pythonPackages/msaslaps/grid/a2rdmdlCommon.py @@ -0,0 +1,132 @@ +## +# 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 +# + +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)) + + grids = DataAccessLayer.getGridData(req, [time]) + + 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/pythonPackages/msaslaps/grid/a2rdmdlStub.py b/pythonPackages/msaslaps/grid/a2rdmdlStub.py index 20913baa40..59b2c9df5b 100644 --- a/pythonPackages/msaslaps/grid/a2rdmdlStub.py +++ b/pythonPackages/msaslaps/grid/a2rdmdlStub.py @@ -1,139 +1,167 @@ -# Example to retrieve a single grid point +## +# This software was developed and / or modified by Raytheon Company, +# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# +# U.S. EXPORT CONTROLLED TECHNICAL DATA +# This software product contains export-restricted data whose +# export/transfer/disclosure is restricted by U.S. law. Dissemination +# to non-U.S. persons whether in the United States or abroad requires +# an export license or other authorization. +# +# Contractor Name: Raytheon Company +# Contractor Address: 6825 Pine Street, Suite 340 +# Mail Stop B8 +# Omaha, NE 68106 +# 402.291.0100 +# +# See the AWIPS II Master Rights File ("Master Rights File.pdf") for +# further licensing information. +## -import GridRequest -from com.raytheon.uf.common.message.response import ResponseMessageGeneric -from com.raytheon.edex.uengine.tasks.decode import FileIn +# 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. +# -# Perform a grid request for data of interest -gr = GridRequest.GridRequest("grid") -gr.addParameter("info.datasetId", "SSSSS") -gr.addParameter("info.level.masterLevel.name", "TTTTT") -gr.addParameter("info.level.levelonevalue", "LLLLL") -gr.addParameter("info.level.leveltwovalue", "22222") -gr.addParameter("info.parameter.abbreviation", "VVVVV") -gr.addParameter("dataTime", "DDDDD HHHHH:00:00.0 (FFFFF)RRRRR") +import a2rdmdlCommon +import argparse +import numpy +import sys -result = gr.query.execute() -size = result.size() -if size == 0: - return ResponseMessageGeneric("Data not available") +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() -# For the purposes of this script, take the first response -currentQuery = result.get(0) +def main(): + user_args = get_args() -# Get the data in memory -fileIn = FileIn("grid", currentQuery) -data = fileIn.execute() + try: + grid, xLen, yLen = a2rdmdlCommon.do_request(user_args) + except Exception as e: + print >> sys.stderr, str(e) + return + + rawData = grid.getRawData() -if data: + msg = "" + if user_args.dimLine: + msg += str(xLen) + " " + str(yLen) + "\n" - # Pull out float[] and get sizes - rawData = data.getFloatData() - xLen = data.getSizes()[0] - yLen = data.getSizes()[1] - dimStr = 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] - # Pull out float[] and get sizes - rawData = data.getFloatData() - xLen = data.getSizes()[0] - yLen = data.getSizes()[1] - msg = "\n" - msg += dimStr - nxy = yLen*xLen - j = nxy-xLen - while j>=0 : - i = 0 - while i=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) : + 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 + " " - 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 - msg += "\n" - j -= xLen - return ResponseMessageGeneric(msg) - -return ResponseMessageGeneric("Data not available") + i += 1 + arrIdx += 1 + + msg += "\n" + j -= xLen + + print msg.strip() + " " + +if __name__ == '__main__': + main() diff --git a/pythonPackages/msaslaps/grid/a2rdmdlXdr.py b/pythonPackages/msaslaps/grid/a2rdmdlXdr.py index 860f96e3f0..eb2ac352d1 100644 --- a/pythonPackages/msaslaps/grid/a2rdmdlXdr.py +++ b/pythonPackages/msaslaps/grid/a2rdmdlXdr.py @@ -1,64 +1,91 @@ -# Example to retrieve a single grid point +## +# 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 GridRequest -from com.raytheon.uf.common.message.response import ResponseMessageGeneric -from com.raytheon.edex.uengine.tasks.decode import FileIn +import sys -# Perform a grid request for data of interest -gr = GridRequest.GridRequest("grid") -gr.addParameter("info.datasetId", "SSSSS") -gr.addParameter("info.level.masterLevel.name", "TTTTT") -gr.addParameter("info.level.levelonevalue", "LLLLL") -gr.addParameter("info.level.leveltwovalue", "22222") -gr.addParameter("info.parameter.abbreviation", "VVVVV") -gr.addParameter("dataTime", "DDDDD HHHHH:00:00.0 (FFFFF)RRRRR") +def get_args(): + return a2rdmdlCommon.get_parser().parse_args() -result = gr.query.execute() -size = result.size() -if size == 0: - return ResponseMessageGeneric("Data not available") +def main(): + user_args = get_args() -# For the purposes of this script, take the first response -currentQuery = result.get(0) + try: + grid, xLen, yLen = a2rdmdlCommon.do_request(user_args) + except Exception as e: + print >> sys.stderr, str(e) + return -# Get the data in memory -fileIn = FileIn("grid", currentQuery) -data = fileIn.execute() + rawData = grid.getRawData() -if data: + msg = str(xLen) + " " + str(yLen) + "\n" - # Pull out float[] and get sizes - rawData = data.getFloatData() - xLen = data.getSizes()[0] - yLen = data.getSizes()[1] - dimStr = 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] - # Pull out float[] and get sizes - rawData = data.getFloatData() - xLen = data.getSizes()[0] - yLen = data.getSizes()[1] - msg = "\n" - msg += dimStr - nxy = yLen*xLen - j = nxy-xLen - mypacker = xdrlib.Packer() - mypacker.reset() - while j>=0 : - i = 0 - while i