Merge branch 'master_15.1.1'(master_15.1.1-13) into field_16.1.1

Conflicts:
	cave/com.raytheon.uf.viz.useradmin/src/com/raytheon/uf/viz/useradmin/ui/UserAdminSelectDlg.java
	cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/FormatterRunner.py
	cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java

Change-Id: Id84ab89d032271c3c7e7919f339e56de7ec1597c

Former-commit-id: 5ac30cbf77afe4982964c88467105f0bf64f2a6e
This commit is contained in:
Ana Rivera 2015-06-01 14:32:26 +00:00
commit f74540b81a
42 changed files with 644 additions and 191 deletions

View file

@ -22,7 +22,8 @@
<list>
<value>com.raytheon.uf.common.dataplugin.text</value>
<value>com.raytheon.uf.common.dataplugin.shef</value>
<value>com.raytheon.edex.plugin.shef</value>
<value>com.raytheon.edex.plugin.shef</value>
<value>com.raytheon.uf.common.bmh</value>
</list>
</property>
</bean>

View file

@ -54,6 +54,7 @@ import com.raytheon.viz.ui.widgets.duallist.IUpdate;
* May 23, 2012 mpduff Initial creation
* Aug 08, 2012 863 jpiatt Added new interface method.
* Jul 28, 2013 2236 mpduff Made resizable.
* May 04, 2015 4419 rferrel Sort {@link #roleDualList}.
*
* </pre>
*
@ -208,6 +209,7 @@ public class ManageUserDlg extends CaveSWTDialog implements IUpdate {
roleConfig.setSelectedList(selectedList);
roleConfig.setFullList(fullList);
roleConfig.setMenuData(menuData);
roleConfig.setSortList(true);
roleDualList = new DualList(stackComp, SWT.NONE, roleConfig, this);
@ -240,6 +242,7 @@ public class ManageUserDlg extends CaveSWTDialog implements IUpdate {
permConfig.setSelectedList(selectedPermList);
permConfig.setFullList(fullPermList);
permConfig.setMenuData(menuData2);
permConfig.setSortList(true);
permDualList = new DualList(stackComp, SWT.NONE, permConfig, this);

View file

@ -20,6 +20,7 @@
package com.raytheon.uf.viz.useradmin.ui;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
@ -71,6 +72,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* and delete buttons. Give delete dialogs
* a title.
* Apr 02, 2015 4345 skorolev Fixed dialog to expand vertically properly.
* May 04, 2015 4419 rferrel Sort {@link #userPermList}.
*
* </pre>
*
@ -563,7 +565,10 @@ public class UserAdminSelectDlg extends CaveSWTDialog implements
rp.add(perm);
}
userPermList.setItems(rp.toArray(new String[rp.size()]));
String[] rpArray = rp.toArray(new String[rp.size()]);
Arrays.sort(rpArray);
userPermList.setItems(rpArray);
}
}

View file

@ -65,7 +65,8 @@ import com.raytheon.viz.avnconfig.AvnConfigConstants.triggerType;
* Feb 16, 2011 7878 rferrel Modifications to use ids.cfg file.
* Apr 08, 2011 8856 rferrel Can now make a new station's templates
* May 24, 2011 9060 rferrel Limit downloading of localization files.
* Aug 09, 2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR
* Aug 09, 2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR
* May 04, 2015 17417 yteng Get all sites from product
*
* </pre>
*
@ -299,13 +300,10 @@ public class TafSiteConfigIni implements ITafSiteConfig {
HierarchicalINIConfiguration config = getProductConfig(product);
if (config != null) {
config.setDelimiterParsingDisabled(true);
String sites = config.getString("sites.idents");
if (sites != null) {
String[] idents = config.getString("sites.idents").split(
"\\s*,\\s*", 0);
for (String id : idents) {
siteList.add(id);
String[] sites = config.getStringArray("sites.idents");
if (sites != null && sites.length > 0) {
for (String site : sites) {
siteList.add(site);
}
}
}

View file

@ -26,7 +26,6 @@ import JUtil, VarDictGroker
import RedirectLogging
import UFStatusHandler
from java.io import File
#
# Runs the text formatter to generate text products
#
@ -41,6 +40,9 @@ from java.io import File
# 04/16/15 #14946 ryu Fix getTimeZones to return the office TZ if timezone
# is not set for any zone in a segment.
# 04/20/2015 #4027 randerso Fixes for formatter autotests
# 05/06/2015 #4467 randerso Convert to upper case before writing to files if
# mixed case is not enabled for the product.
# Cleaned up file writing code
#
#
@ -105,6 +107,33 @@ def executeFromJava(databaseID, site, username, dataMgr, forecastList, logFile,
RedirectLogging.restore()
return forecasts
def getPid(forecast):
# taken from ProductParser.py
import re
sl = r'^' # start of line
el = r'\s*?\n' # end of line
id3 = r'[A-Za-z]{3}' # 3 charater word
empty = r'^\s*' + el # empty line
wmoid = r'(?P<wmoid>[A-Z]{4}\d{2})' # wmoid
fsid = r'(?P<fsid>[A-Z]{4})' # full station id
pit = r'(?P<pit>\d{6})' # product issuance time UTC
ff = r'(?P<funnyfield> ' + id3 + ')?' # "funny" field
# CI block
ci_start = sl + wmoid + ' ' + fsid + ' ' + pit + ff + el
awipsid = r'(?P<pil>(?P<cat>[A-Z0-9]{3})(?P<lid>[A-Z0-9]{1,3}))' + el
ci_block = r'(?P<ciblock>' + ci_start + awipsid + '\n?)'
ci_re = re.compile(ci_block)
pid = None
m = ci_re.search(forecast)
if m is not None:
pid = m.group('cat')
return pid
def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode,
username, dataMgr, serverFile=None,
@ -234,16 +263,31 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode,
# For each Forecast Type,
# Create generate forecast
forecasts = ""
forecasts = "" # returned value
outForecasts = "" # written to output files
for forecastType in forecastList:
forecast = formatter.getForecast(forecastType, argDict)
forecasts = forecasts + forecast
# Convert data written to files to upper case if required
mixedCase = False
pid = getPid(forecast)
if pid is None:
logger.warning("Unable to determine PID: defaulting to upper case")
else:
from com.raytheon.uf.common.dataplugin.text.db import MixedCaseProductSupport
mixedCase = MixedCaseProductSupport.isMixedCase(pid)
if mixedCase:
outForecasts = outForecasts + forecast
else:
outForecasts = outForecasts + forecast.upper()
logger.info("Text:\n" + str(forecasts))
try:
outputFile = argDict["outputFile"]
success = writeToFile(forecasts, outputFile, "w")
success = writeToFile(outForecasts, outputFile, "w")
if success == 0:
print "Couldn't open output file", outputFile
logger.error("Couldn't open output file: ", outputFile)
@ -253,7 +297,7 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode,
try:
outputFile = argDict["serverOutputFile"]
success = writeToFile(forecasts, outputFile, "w")
success = writeToFile(outForecasts, outputFile, "w")
if success == 0:
print "Couldn't open output file", outputFile
logger.error("Couldn't open output file: ", outputFile)
@ -264,7 +308,7 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode,
try:
appendFile = argDict["appendFile"]
success = writeToFile(forecasts, appendFile, "a")
success = writeToFile(outForecasts, appendFile, "a")
if success == 0:
print "Couldn't open append file", appendFile
logger.error("Couldn't write to append file: ", appendFile)
@ -275,7 +319,7 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode,
try:
serverFile = argDict["serverFile"]
writeToSite = (username == "SITE")
success = writeToServerFile(forecasts, serverFile, writeToSite)
success = writeToServerFile(outForecasts, serverFile, writeToSite)
if success == 0:
print "Couldn't open server output file", serverFile
logger.error("Couldn't open server output file: ", serverFile)
@ -283,6 +327,8 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode,
except:
pass
del outForecasts
# Remove any lat/lon areas created temporarily
#global LatLonIds
#argDict["ifpClient"].deleteReferenceData(LatLonIds)
@ -309,29 +355,37 @@ def getAbsTime(timeStr):
return AbsTime.absTimeYMD(year, month, day, hour, minute)
def writeToFile(forecasts, outputFile, mode):
if not outputFile is None and outputFile != "":
outfile = open(outputFile, mode)
os.chmod(outputFile, 0644)
if outfile is None:
if outputFile:
logger.info("Writing forecast to " + outputFile)
try:
with open(outputFile, mode) as outfile:
outfile.write(forecasts)
os.chmod(outputFile, 0644)
except:
logger.exception("Error writing forecast to "+outputFile)
return 0
else:
outfile.write(forecasts)
outfile.close()
return 1
def writeToServerFile(forecasts, outputFile, writeToSite):
if not outputFile is None and outputFile != "":
if writeToSite:
ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.SITE)
else:
ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.USER)
filePath = File.separatorChar.join(["gfe", "text", "PRODGEN", outputFile + ".PRODGEN"])
lFile = PATH_MGR.getLocalizationFile(ctx, filePath)
javaFile = lFile.getFile()
outfile = open(javaFile.getAbsolutePath(), 'w')
outfile.write(forecasts)
outfile.close()
return lFile.save()
if outputFile:
try:
if writeToSite:
ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.SITE)
else:
ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.USER)
filePath = PATH_MGR.SEPARATOR.join(["gfe", "text", "PRODGEN", outputFile + ".PRODGEN"])
lFile = PATH_MGR.getLocalizationFile(ctx, filePath)
logger.info("Writing forecast to " + str(lFile))
from LockingFile import File
with File(lFile.getFile(), "", 'w') as outfile:
outfile.write(forecasts)
return lFile.save()
except:
logger.exception("Error writing forecast to " + str(lFile))
return 0
return 1
def getScripts(paths, nameMap, definitionMap):

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<WEGroup name="NWPS">
<WEItem relativeCycleNumber="0" parmID="WaveHeight_SFC:xxx_GRID__nwpsCG1_00000000_0000"/>
<WEItem relativeCycleNumber="0" parmID="Period_SFC:xxx_GRID__nwpsCG1_00000000_0000"/>
<WEItem relativeCycleNumber="0" parmID="SwanSwell_SFC:xxx_GRID__nwpsCG1_00000000_0000"/>
</WEGroup>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<WEGroup name="nwpsTrackingCG0">
<WEItem parmID="Period1_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period2_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period3_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period4_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period5_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period6_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period7_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period8_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period9_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Period10_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave1_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave2_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave3_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave4_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave5_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave6_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave7_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave8_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave9_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
<WEItem parmID="Wave10_SFC:xxx_GRID__nwpsTrkngCG0_20150207_0600" relativeCycleNumber="0"/>
</WEGroup>

View file

@ -19,7 +19,10 @@
further_licensing_information.
-->
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="menuItem" menuText="Cloud Cover" key="CCP" indentText="false" />
<contribute xsi:type="menuItem" menuText="Cloud Cover Anl Uncertainty" key="CCPerranl" indentText="false" />
<contribute xsi:type="menuItem" menuText="Visibility" key="Vis" indentText="false" />
<contribute xsi:type="menuItem" menuText="Visibility Anl Uncertainty" key="Viserranl" indentText="false" />
<contribute xsi:type="menuItem" menuText="Turbulence" key="TURB" indentText="false" />
<contribute xsi:type="menuItem" menuText="Turbulence Index" key="TPFI" indentText="false" />
<contribute xsi:type="menuItem" menuText="Icing Probability" key="ICPRB" indentText="false" />

View file

@ -35,7 +35,9 @@ import javax.jms.Session;
import com.raytheon.uf.common.dataplugin.text.request.InsertStdTextProductRequest;
import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.comm.JMSConnection;
@ -60,6 +62,7 @@ import com.raytheon.viz.texteditor.util.SiteAbbreviationUtil;
* 02Aug2010 2187 cjeanbap Update variable/method signature to be consistent.
* 04Oct2010 7193 cjeanbap Add time-to-live value to MessageProducer.
* Sep 13, 2013 2368 rjpeter Set delivery mode to PERSISTENT.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author mschenke
@ -70,6 +73,9 @@ public class WarningSender implements IWarngenObserver {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(WarningSender.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
private final String hostName = null;
private boolean notifyError;
@ -105,8 +111,8 @@ public class WarningSender implements IWarngenObserver {
long t0 = System.currentTimeMillis();
String siteNode = SiteAbbreviationUtil.getSiteNode(LocalizationManager
.getInstance().getCurrentSite());
statusHandler.debug("Get site node time: "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("Get site node time",
System.currentTimeMillis() - t0);
if (host == null) {
statusHandler.handle(Priority.ERROR,
"Text Workstation host not set in preferences.");
@ -144,7 +150,7 @@ public class WarningSender implements IWarngenObserver {
m.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
mp.send(m);
long t1 = System.currentTimeMillis();
statusHandler.debug(id + " sent to text workstation in "
perfLog.log(id + " sent to text workstation in "
+ (t1 - t0) + "ms in " + (connectCount + 1)
+ (connectCount > 0 ? " tries" : " try"));
messageNotSent = false;
@ -260,8 +266,8 @@ public class WarningSender implements IWarngenObserver {
ThriftClient.sendRequest(new InsertStdTextProductRequest(id, warning,
operationalMode));
statusHandler.debug(id + " saved to textdb in "
+ (System.currentTimeMillis() - t0) + "ms");
perfLog.logDuration(id + " save to textdb",
System.currentTimeMillis() - t0);
}
public static String getCurTimeString() {

View file

@ -27,6 +27,8 @@ import com.raytheon.uf.common.geospatial.ISpatialQuery.SearchMode;
import com.raytheon.uf.common.geospatial.SpatialException;
import com.raytheon.uf.common.geospatial.SpatialQueryFactory;
import com.raytheon.uf.common.geospatial.SpatialQueryResult;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.maps.rsc.DbMapQueryFactory;
import com.raytheon.viz.core.map.GeoUtil;
@ -53,6 +55,7 @@ import com.vividsolutions.jts.geom.Point;
* Feb 12, 2013 1600 jsanchez Used adjustAngle method from AbstractStormTrackResource.
* Mar 5, 2013 1600 jsanchez Used AdjustAngle instead of AbstractStormTrackResource to handle angle adjusting.
* Mar 26, 2013 1819 jsanchez Allowed points to be not be based on point source inclusion constraints.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
*
* </pre>
*
@ -61,6 +64,9 @@ import com.vividsolutions.jts.geom.Point;
*/
abstract public class AbstractDbSourceDataAdaptor {
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
private static final String transformedKey = "com.raytheon.transformed";
private static final String GEOM_FIELD = "the_geom";
@ -176,8 +182,8 @@ abstract public class AbstractDbSourceDataAdaptor {
ptFields.toArray(new String[ptFields.size()]),
searchArea, filter, SearchMode.INTERSECTS);
}
System.out.println("Retrieve location data for '" + pointSource
+ "' = " + (System.currentTimeMillis() - t0));
perfLog.logDuration("Retrieve location data for '" + pointSource + "'",
System.currentTimeMillis() - t0);
} catch (SpatialException e) {
throw new VizException("Error querying " + pointSource + " table: "
+ e.getLocalizedMessage(), e);

View file

@ -44,7 +44,9 @@ import com.raytheon.uf.common.geospatial.ISpatialQuery.SearchMode;
import com.raytheon.uf.common.geospatial.SpatialException;
import com.raytheon.uf.common.geospatial.SpatialQueryFactory;
import com.raytheon.uf.common.geospatial.SpatialQueryResult;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.exception.VizException;
@ -87,6 +89,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
* Sep 14, 2014 ASM #641 dhuffman Filtered out cases where Areas do not match Zones by using
* refactored WarngenLayer::filterArea.
* Mar 9, 2014 ASM #17190 D. Friedman Use fipsField and areaField for unique area ID.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author chammack
@ -96,6 +99,9 @@ public class Area {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(Area.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
/**
* If an area greater than this percentage of the area is covered, no
* direction is included
@ -167,6 +173,7 @@ public class Area {
// Query for points within polygon
SpatialQueryResult[] ptFeatures = null;
long t0 = System.currentTimeMillis();
if (pointField != null) {
try {
ptFeatures = SpatialQueryFactory.create().query(pointSource,
@ -177,6 +184,8 @@ public class Area {
e);
}
}
perfLog.logDuration("affected areas '" + areaConfig.getVariable()
+ "' spatial query", System.currentTimeMillis() - t0);
Abbreviation abbreviation = null;
@ -194,6 +203,7 @@ public class Area {
List<String> uniqueAreaIDs = new ArrayList<String>();
List<AffectedAreas> areas = new ArrayList<AffectedAreas>();
long t0f = System.currentTimeMillis();
for (GeospatialData regionFeature : countyMap.values()) {
Geometry regionGeom = regionFeature.geometry;
PreparedGeometry preparedRegionGeom = regionFeature.prepGeom;
@ -284,6 +294,8 @@ public class Area {
areas.add(area);
}
}
perfLog.logDuration("affected areas '" + areaConfig.getVariable()
+ "' features", System.currentTimeMillis() - t0f);
// Perform Sort
if (fields.size() > 0) {

View file

@ -54,6 +54,7 @@ import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.geom.PrecisionModel;
import com.vividsolutions.jts.geom.TopologyException;
import com.vividsolutions.jts.geom.prep.PreparedGeometry;
import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
import com.vividsolutions.jts.precision.SimpleGeometryPrecisionReducer;
@ -90,7 +91,9 @@ import com.vividsolutions.jts.precision.SimpleGeometryPrecisionReducer;
* hatched area would be retained after redrawing.
* 07/22/2014 DR 17475 Qinglu Lin Updated createPolygonByPoints() and created second createPolygonByPoints().
* 04/02/2015 DR 4353 dgilling Fix bad exception handler in hatchWarningArea.
*
* 04/29/2015 DR 17310 D. Friedman Use Geometry.buffer() to fix self-intersections. Fix bug in alterVertexes.
* 05/07/2015 DR 17438 D. Friedman Clean up debug and performance logging.
* 05/08/2015 DR 17310 D. Friedman Prevent reducePoints from generating invalid polygons.
* </pre>
*
* @author mschenke
@ -570,12 +573,27 @@ public class PolygonUtil {
GeometryFactory gf = new GeometryFactory();
points.add(new Coordinate(points.get(0)));
truncate(points, 2);
Polygon rval = gf.createPolygon(gf.createLinearRing(points
.toArray(new Coordinate[points.size()])), null);
if (!rval.isValid()) {
statusHandler.handle(Priority.DEBUG, String.format(
"Polygon %s is invalid. Attempting to fix...", rval));
String resultMessage = null;
try {
Polygon p2 = (Polygon) rval.buffer(0.0);
rval = gf.createPolygon((LinearRing) p2.getExteriorRing());
resultMessage = String.format(" ...fixed. Result: %s", rval);
} catch (TopologyException e) {
resultMessage = " ...fix failed";
} catch (ClassCastException e) {
resultMessage = " ...resulted in something other than a polygon";
}
statusHandler.handle(Priority.DEBUG, resultMessage);
}
if (rval.isValid() == false) {
System.out.println("Fixing intersected segments");
statusHandler.handle(Priority.DEBUG, "Fixing intersected segments");
Coordinate[] coords = rval.getCoordinates();
adjustVertex(coords);
PolygonUtil.round(coords, 2);
@ -841,6 +859,7 @@ public class PolygonUtil {
int npts = pts.length;
double xavg = 0, yavg = 0;
int[] yesList = new int[npts];
boolean[] excludeList = new boolean[npts];
int nyes = 0;
int k, k1, k2, kn, y, simple;
double bigDis, maxDis, dis, dx, dy, dx0, dy0, bas;
@ -908,7 +927,9 @@ public class PolygonUtil {
}
if (k == k2) {
break;
}
if (excludeList[k])
continue;
dx = pts[k].x - pts[k1].x;
dy = pts[k].y - pts[k1].y;
dis = dx * dx0 + dy * dy0;
@ -916,7 +937,8 @@ public class PolygonUtil {
dis = -dis;
} else {
dis -= bas;
}
double newMaxDis = maxDis;
int newSimple = simple;
if (dis <= 0) {
if (simple == 0) {
continue;
@ -924,19 +946,31 @@ public class PolygonUtil {
dis = dx * dy0 - dy * dx0;
if (dis < 0) {
dis = -dis;
}
} else if (simple != 0) {
maxDis = simple = 0;
}
if (dis < maxDis) {
} else if (simple != 0)
newMaxDis = newSimple = 0;
if (dis < newMaxDis) {
maxDis = newMaxDis;
continue;
}
if (! checkReducePointsValid(pts, yesList, nyes, k)) {
excludeList[k] = true;
continue;
}
simple = newSimple;
maxDis = dis;
kn = k;
}
k1 = k2;
}
Arrays.fill(excludeList, false);
if (kn < 0) {
statusHandler.debug(
String.format("reducePoints(..., %d): Unable to find a valid point\npoints: %s",
maxNpts, points));
break;
}
if (simple != 0 && nyes > 2) {
if (maxDis * 40 < bigDis) {
break;
@ -963,6 +997,24 @@ public class PolygonUtil {
points.addAll(Arrays.asList(Arrays.copyOf(pts, npts)));
}
private boolean checkReducePointsValid(Coordinate[] pts, int[] yesList, int nyes, int k) {
Coordinate[] verts = new Coordinate[nyes + 2];
int vi = 0;
for (int i = 0; i < nyes; ++i) {
if (k >= 0 && k < yesList[i]) {
verts[vi++] = pts[k];
k = -1;
}
verts[vi++] = pts[yesList[i]];
}
if (k >= 0) {
verts[vi++] = pts[k];
}
verts[verts.length - 1] = new Coordinate(verts[0]);
GeometryFactory gf = new GeometryFactory();
return gf.createPolygon(verts).isValid();
}
/**
* A1 ported point reduction method 2
*
@ -1786,9 +1838,8 @@ public class PolygonUtil {
if (intersectCoord != null) {
index1 = calcShortestDistance(intersectCoord, ls1);
index2 = calcShortestDistance(intersectCoord, ls2);
Coordinate c = new Coordinate(
0.5 * (coord[index1].x + coord[2 + index2].x),
0.5 * (coord[index1].y + coord[2 + index2].y));
Coordinate c = new Coordinate(0.5*(coord[index[index1]].x + coord[index[2+index2]].x),
0.5*(coord[index[index1]].y + coord[index[2+index2]].y));
PolygonUtil.round(c, 2);
coord[index[index1]] = new Coordinate(c);
coord[index[2 + index2]] = new Coordinate(c);

View file

@ -51,7 +51,9 @@ import com.raytheon.uf.common.dataquery.requests.DbQueryRequest;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.dataquery.responses.DbQueryResponse;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.util.TimeUtil;
@ -86,6 +88,7 @@ import com.vividsolutions.jts.geom.Polygon;
* extension of a watch to counties which are of same/different fe_area.
* Sep 25, 2014 ASM #16783 D. Friedman Do not use VTEC action to determine Watch uniqueness.
* Apr 28, 2015 RODO #4027 randerso Expunged Calendar from ActiveTableRecord
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author jsanchez
@ -96,6 +99,9 @@ public class WatchUtil {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(WatchUtil.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
private static final UnitConverter milesToKilometer = NonSI.MILE
.getConverterTo(SI.KILOMETER);
@ -230,8 +236,8 @@ public class WatchUtil {
Polygon watchArea = (Polygon) warningPolygon
.buffer(milesToKilometer.convert(watchAreaBuffer)
/ KmToDegrees);
System.out.println("create watch area buffer time: "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("Create watch area buffer time",
System.currentTimeMillis() - t0);
HashSet<String> validUgcZones = new HashSet<String>(
warngenLayer.getUgcsForWatches(watchArea,
GeoFeatureType.COUNTY));

View file

@ -64,7 +64,9 @@ import com.raytheon.uf.common.geospatial.ISpatialQuery.SearchMode;
import com.raytheon.uf.common.geospatial.MapUtil;
import com.raytheon.uf.common.geospatial.SpatialQueryFactory;
import com.raytheon.uf.common.geospatial.SpatialQueryResult;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.exception.VizException;
@ -118,6 +120,7 @@ import com.vividsolutions.jts.geom.Point;
* Dec 4, 2013 2604 jsanchez Refactored GisUtil.
* Apr 29, 2014 3033 jsanchez Updated method to retrieve files in localization.
* Jun 17, 2014 DR 17390 Qinglu Lin Updated getClosestPoints().
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author chammack
@ -127,6 +130,9 @@ public class Wx {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(Wx.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
private long wwaStopTime;
private long wwaStartTime;
@ -531,8 +537,8 @@ public class Wx {
pathcasts.remove(pathcasts.size() - 1);
}
System.out.println("Time to get pathcast = "
+ (System.currentTimeMillis() - t0) + "ms");
perfLog.logDuration("Get pathcast",
System.currentTimeMillis() - t0);
return pathcasts.toArray(new PathCast[pathcasts.size()]);
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
@ -608,8 +614,8 @@ public class Wx {
+ variable + "'", t);
}
}
System.out.println("Time to get closestPoints = "
+ (System.currentTimeMillis() - t0) + "ms");
perfLog.logDuration("Get closestPoints",
System.currentTimeMillis() - t0);
return pointsMap;
}
@ -729,8 +735,8 @@ public class Wx {
localizedSite));
}
long t1 = System.currentTimeMillis();
System.out.println("getClosestPoint.dbQuery took " + (t1 - t0)
+ " for point source " + pointConfig.getPointSource());
perfLog.logDuration("getClosestPoints.dbQuery for point source "
+ pointConfig.getPointSource(), t1 - t0);
}
// Convert searchArea to a local projection

View file

@ -67,7 +67,9 @@ import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction;
import com.raytheon.uf.common.dataplugin.warning.config.BulletActionGroup;
import com.raytheon.uf.common.dataplugin.warning.config.DamInfoBullet;
import com.raytheon.uf.common.dataplugin.warning.config.WarngenConfiguration;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.SimulatedTime;
@ -159,6 +161,11 @@ import com.vividsolutions.jts.geom.Polygon;
* Jul 01, 2014 DR 17450 D. Friedman Use list of templates from backup site.
* Jul 21, 2014 3419 jsanchez Created a hidden button to make recreating polygons easier.
* Feb 26, 2015 3353 rjpeter Fixed NPE on clear.
* Apr 27, 2015 DR 17359 Qinglu Lin Updated changeTemplate(). The approach for solving slowness issue while switching from
* one marine product to another is to skip computing hatching area. The hatching area might
* not be as expected if percentage/area is different between the two products. But the
* chance for that to occur is trivial.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author chammack
@ -169,6 +176,9 @@ public class WarngenDialog extends CaveSWTDialog implements
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(WarngenDialog.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
/*
* This flag allows a hidden button to appear to help recreating warning
* polygons that had issues in the feed.
@ -1111,6 +1121,7 @@ public class WarngenDialog extends CaveSWTDialog implements
* Action for OK button
*/
private void okPressed() {
final long t0okPressed = System.currentTimeMillis();
if (checkDamSelection() == false) {
return;
} else if (warngenLayer.getWarningArea() == null) {
@ -1165,9 +1176,9 @@ public class WarngenDialog extends CaveSWTDialog implements
@Override
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
long t0 = System.currentTimeMillis();
try {
monitor.beginTask("Generating product", 1);
long t0 = System.currentTimeMillis();
String result = TemplateRunner.runTemplate(
warngenLayer, startTime.getTime(),
endTime.getTime(), selectedBullets,
@ -1178,8 +1189,6 @@ public class WarngenDialog extends CaveSWTDialog implements
while (m.find()) {
totalSegments++;
}
System.out.println("Time to run template = "
+ (System.currentTimeMillis() - t0));
} catch (Exception e) {
statusHandler.handle(
Priority.PROBLEM,
@ -1187,19 +1196,23 @@ public class WarngenDialog extends CaveSWTDialog implements
+ e.getLocalizedMessage(), e);
} finally {
monitor.done();
perfLog.logDuration("Run template",
System.currentTimeMillis() - t0);
perfLog.logDuration("click to finish template",
System.currentTimeMillis() - t0okPressed);
}
}
});
System.out.println(WarningSender.getCurTimeString()
+ ": Creating Transmitting Warning Job");
statusHandler.handle(Priority.DEBUG,
"Creating Transmitting Warning Job");
new Job("Transmitting Warning") {
@Override
protected IStatus run(IProgressMonitor monitor) {
System.out.println(WarningSender.getCurTimeString()
+ ": Transmitting Warning Job Running");
statusHandler.debug(
": Transmitting Warning Job Running");
// Launch the text editor display as the warngen editor
// dialog using the result aka the warngen text product.
@ -1218,6 +1231,8 @@ public class WarngenDialog extends CaveSWTDialog implements
"Error sending warning: "
+ e.getLocalizedMessage(), e);
}
perfLog.logDuration("click to finish sending",
System.currentTimeMillis() - t0okPressed);
return Status.OK_STATUS;
}
}.schedule();
@ -1657,14 +1672,17 @@ public class WarngenDialog extends CaveSWTDialog implements
.equalsIgnoreCase(lastAreaSource);
boolean snapHatchedAreaToPolygon = isDifferentAreaSources;
boolean preservedSelection = !isDifferentAreaSources;
// If template has a different hatched area source from the previous
// template, then the warned area would be based on the polygon and not
// preserved.
try {
warngenLayer.updateWarnedAreas(snapHatchedAreaToPolygon,
preservedSelection);
} catch (VizException e1) {
statusHandler.handle(Priority.PROBLEM, "WarnGen Error", e1);
if (isDifferentAreaSources || !warngenLayer.getConfiguration()
.getHatchedAreaSource().getAreaSource().toLowerCase().equals("marinezones")) {
// If template has a different hatched area source from the previous
// template, then the warned area would be based on the polygon and not
// preserved.
try {
warngenLayer.updateWarnedAreas(snapHatchedAreaToPolygon,
preservedSelection);
} catch (VizException e1) {
statusHandler.handle(Priority.PROBLEM, "WarnGen Error", e1);
}
}
// Properly sets the "Create Text" button.
setInstructions();

View file

@ -81,7 +81,9 @@ import com.raytheon.uf.common.jms.notification.INotificationObserver;
import com.raytheon.uf.common.jms.notification.NotificationException;
import com.raytheon.uf.common.jms.notification.NotificationMessage;
import com.raytheon.uf.common.site.SiteMap;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
@ -236,6 +238,8 @@ import com.vividsolutions.jts.io.WKTReader;
* 02/09/2015 3954 dlovely Only draw "W" if the county is displayed.
* 02/25/2014 3353 rjpeter Fix synchronized use case, updated to not create dialog before init is finished.
* 04/24/2015 ASM #17394 D. Friedman Fix geometries that become invalid in local coordinate space.
* 05/07/2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* 05/08/2015 ASM #17310 D. Friedman Log input polygon when output of AreaHatcher is invalid.
* </pre>
*
* @author mschenke
@ -246,6 +250,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(WarngenLayer.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
String uniqueFip = null;
String backupOfficeShort = null;
@ -490,9 +497,11 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
if ((warningArea != null) && (warningPolygon != null)) {
long t0 = System.currentTimeMillis();
Polygon inputWarningPolygon = warningPolygon;
Polygon outputHatchedArea = null;
Geometry outputHatchedWarningArea = null;
String adjustmentMessage = null;
try {
warningPolygon = PolygonUtil
.removeDuplicateCoordinate(warningPolygon);
@ -512,11 +521,12 @@ public class WarngenLayer extends AbstractStormTrackResource {
GeometryFactory gf = new GeometryFactory();
LinearRing lr = gf.createLinearRing(coords);
outputHatchedArea = gf.createPolygon(lr, null);
long tadj0 = System.currentTimeMillis();
int adjustPolygon_counter = 0;
while (!outputHatchedArea.isValid()
&& (adjustPolygon_counter < 1)) {
System.out.println("Calling adjustPolygon #"
+ adjustPolygon_counter);
adjustmentMessage = "adjustPolygon #"
+ adjustPolygon_counter;
PolygonUtil.adjustPolygon(coords);
PolygonUtil.round(coords, 2);
coords = PolygonUtil
@ -529,16 +539,11 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
int counter = 0;
if (!outputHatchedArea.isValid() && (counter < 2)) {
System.out
.println("calling adjustVertex & alterVertexes: loop #"
+ counter);
int adjustVertex_counter = 0;
lr = gf.createLinearRing(coords);
outputHatchedArea = gf.createPolygon(lr, null);
while (!outputHatchedArea.isValid()
&& (adjustVertex_counter < 5)) {
System.out.println(" Calling adjustVertex #"
+ adjustVertex_counter);
coords = PolygonUtil.adjustVertex(coords);
coords = PolygonUtil
.removeDuplicateCoordinate(coords);
@ -549,12 +554,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
adjustVertex_counter += 1;
}
int inner_counter = 0;
System.out.println("");
while (!outputHatchedArea.isValid()
&& (inner_counter < 5)) {
System.out
.println(" Calling alterVertexes #"
+ inner_counter);
coords = PolygonUtil.alterVertexes(coords);
coords = PolygonUtil
.removeDuplicateCoordinate(coords);
@ -564,7 +565,15 @@ public class WarngenLayer extends AbstractStormTrackResource {
outputHatchedArea = gf.createPolygon(lr, null);
inner_counter += 1;
}
counter += 1;
adjustmentMessage = String.format(
"adjustVertex & alterVertexes: %d, %d",
adjustVertex_counter, inner_counter);
}
if (adjustmentMessage != null) {
perfLog.logDuration("Vertex adjustments", System.currentTimeMillis() - tadj0);
statusHandler.debug(adjustmentMessage);
}
for (Coordinate c : outputHatchedArea.getCoordinates()) {
if (Double.isNaN(c.x) || Double.isNaN(c.y)) {
@ -575,6 +584,10 @@ public class WarngenLayer extends AbstractStormTrackResource {
outputHatchedWarningArea = createWarnedArea(
latLonToLocal(outputHatchedArea),
latLonToLocal(warningArea));
if (! outputHatchedArea.isValid()) {
statusHandler.debug(String.format("Input %s redrawn to invalid %s",
inputWarningPolygon, outputHatchedArea));
}
}
this.hatchedArea = outputHatchedArea;
this.hatchedWarningArea = outputHatchedWarningArea;
@ -587,9 +600,10 @@ public class WarngenLayer extends AbstractStormTrackResource {
* priority in getHatchedAreas().
*/
statusHandler.handle(Priority.DEBUG, String.format(
"Error redrawing polygon: %s\n Input: %s\n",
e.getLocalizedMessage(), inputWarningPolygon), e);
"Error redrawing polygon: %s\n Input: %s\nAdjustments: %s\n",
e.getLocalizedMessage(), inputWarningPolygon, adjustmentMessage), e);
}
perfLog.logDuration("AreaHatcher total", System.currentTimeMillis() - t0);
}
return Status.OK_STATUS;
@ -610,6 +624,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
public synchronized Geometry[] getHatchedAreas() {
long t0 = System.currentTimeMillis();
while (getState() != Job.NONE) {
try {
join();
@ -617,6 +632,10 @@ public class WarngenLayer extends AbstractStormTrackResource {
return new Geometry[] { null, null };
}
}
long t1 = System.currentTimeMillis();
if (t1 - t0 > 250) {
perfLog.logDuration("Wait for AreaHatcher", t1 - t0);
}
if (getResult() == null) {
return null;
}
@ -1259,8 +1278,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
this.configuration = config;
}// end synchronize
System.out.println("Total time to init warngen config = "
+ (System.currentTimeMillis() - t0) + "ms");
perfLog.logDuration("Init warngen config",
System.currentTimeMillis() - t0);
}
private void initializeGeomUpdateObserver() {
@ -1459,8 +1478,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
gData.localGridGeometry = new GeneralGridGeometry(range, ge);
System.out.println("Time to lookup geospatial data "
+ (System.currentTimeMillis() - tq0));
perfLog.logDuration("Lookup geospatial data",
System.currentTimeMillis() - tq0);
siteMap.put(currKey, gData);
GeospatialData[] timezones = GeospatialFactory.getTimezones();
@ -1957,8 +1976,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
: null);
updateWarnedAreaState(newWarningArea, snapHatchedAreaToPolygon);
System.out.println("determining hatchedArea took "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("Determining hatchedArea",
System.currentTimeMillis() - t0);
}
/**
@ -2664,8 +2683,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
return true;
}
long t0 = System.currentTimeMillis();
try {
long t0 = System.currentTimeMillis();
Polygon hatched = state.getWarningPolygon();
Geometry hatchedArea = state.getWarningArea();
if (areaHatcher != null) {
@ -2713,13 +2732,13 @@ public class WarngenLayer extends AbstractStormTrackResource {
issueRefresh();
result = false;
}
System.out.println("Time to createWarningPolygon: "
+ (System.currentTimeMillis() - t0) + "ms");
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
"Error hatching polygon", e);
result = false;
}
perfLog.logDuration("redrawBoxFromHatched",
System.currentTimeMillis() - t0);
issueRefresh();
}
return result;

View file

@ -62,7 +62,9 @@ import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.site.SiteMap;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
@ -145,6 +147,7 @@ import com.vividsolutions.jts.io.WKTReader;
* Aug 28, 2014 ASM #15551 Qinglu Lin Replaced 1200 PM/1200 AM by NOON/MIDNIGHT, removed days in
* included tornado/severe thunderstorm watch message.
* Sep 18, 2014 ASM #15465 Qinglu Lin For backup, get officeShort and officeLoc from backup WFO's config.xml.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author njensen
@ -155,6 +158,9 @@ public class TemplateRunner {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(TemplateRunner.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
private static final String LOGIN_NAME_KEY = "LOGNAME";
private static final Pattern BBB_PATTERN = Pattern
@ -295,15 +301,15 @@ public class TemplateRunner {
t0 = System.currentTimeMillis();
areas = area.findAffectedAreas(config, warnPolygon, warningArea,
threeLetterSiteId);
System.out.println("Time to get areas = "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("runTemplate get areas",
System.currentTimeMillis() - t0);
context.put(config.getHatchedAreaSource().getVariable(), areas);
t0 = System.currentTimeMillis();
intersectAreas = area.findInsectingAreas(config, warnPolygon,
warningArea, threeLetterSiteId, warngenLayer);
System.out.println("Time to get intersecting areas = "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("runTemplate get intersecting areas",
System.currentTimeMillis() - t0);
for (String ia : intersectAreas.keySet()) {
context.put(ia, intersectAreas.get(ia));
}
@ -380,9 +386,8 @@ public class TemplateRunner {
"Either timezoneGeom or/and warningArea is null. "
+ "Timezone cannot be determined.");
}
System.out
.println("Time to do size computation = "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("runTemplate size computation",
System.currentTimeMillis() - t0);
if (totalSize > minSize) {
timeZones.add(oneLetterTZ[i]);
}
@ -544,8 +549,8 @@ public class TemplateRunner {
context.put("eventLocation", coords);
t0 = System.currentTimeMillis();
ToolsDataManager.getInstance().setStormTrackData(std);
System.out.println("save storm track data: "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("Save storm track data",
System.currentTimeMillis() - t0);
} else {
// Retrieve the old Warning
// Example: s[0-5] = T.CON-KLWX.SV.W.0123
@ -601,8 +606,8 @@ public class TemplateRunner {
std.setMotionSpeed(oldWarn.getMotspd());
t0 = System.currentTimeMillis();
ToolsDataManager.getInstance().setStormTrackData(std);
System.out.println("save storm track data: "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("Save storm track data",
System.currentTimeMillis() - t0);
}
}
@ -859,8 +864,7 @@ public class TemplateRunner {
WatchUtil watchUtil = new WatchUtil(warngenLayer);
List<Watch> watches = watchUtil.getWatches(config, warnPolygon,
simulatedTime);
System.out.println("getWatches time: "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("getWatches", System.currentTimeMillis() - t0);
if (watches != null && watches.isEmpty() == false) {
context.put("watches", watches);
}
@ -875,8 +879,7 @@ public class TemplateRunner {
long tz0 = System.currentTimeMillis();
String script = createScript(warngenLayer.getTemplateName() + ".vm",
context);
System.out.println("velocity time: "
+ (System.currentTimeMillis() - tz0));
perfLog.logDuration("velocity", System.currentTimeMillis() - tz0);
String text = script.toString();
WarningTextHandler handler = WarningTextHandlerFactory.getHandler(

View file

@ -23,6 +23,8 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.viz.warngen.gis.AffectedAreas;
/**
@ -36,6 +38,7 @@ import com.raytheon.viz.warngen.gis.AffectedAreas;
* ------------ ---------- ----------- --------------------------
* Sep 24, 2012 15322 jsanchez Initial creation
* Jan 8, 2013 15664 Qinglu Lin Appended WarningAction to handle()'s parameter list, etc.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
*
* </pre>
*
@ -43,6 +46,8 @@ import com.raytheon.viz.warngen.gis.AffectedAreas;
* @version 1.0
*/
public class WarningTextHandler {
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
private AbstractLockingBehavior lockingBehavior;
@ -69,8 +74,8 @@ public class WarningTextHandler {
text = clean(text);
System.out.println("Time to handle the text: "
+ (System.currentTimeMillis() - t0));
perfLog.logDuration("Handle the text",
System.currentTimeMillis() - t0);
return text;
}

View file

@ -41,7 +41,9 @@ import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.dataquery.responses.DbQueryResponse;
import com.raytheon.uf.common.site.SiteMap;
import com.raytheon.uf.common.status.IPerformanceStatusHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.PerformanceStatus;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.ISimulatedTimeChangeListener;
@ -78,6 +80,7 @@ import com.vividsolutions.jts.geom.Geometry;
* Aug 14, 2013 DR 16483 Qinglu Lin Fixed no option issue in WarnGen dropdown menu after
* issuance of an CANCON and restart of CAVE.
* Oct 16, 2013 2439 rferrel Restrict retrieval of warnings to prevent getting future warnings.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* </pre>
*
* @author mschenke
@ -88,6 +91,9 @@ public class CurrentWarnings {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(CurrentWarnings.class);
private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("WG:");
public static interface IWarningsArrivedListener {
public void warningsArrived();
}
@ -244,8 +250,8 @@ public class CurrentWarnings {
long t0 = System.currentTimeMillis();
List<AbstractWarningRecord> warnings = requestRecords(constraints);
System.out.println("Time to request CurrentWarnings records: "
+ (System.currentTimeMillis() - t0) + "ms");
perfLog.logDuration("Request CurrentWarnings records",
System.currentTimeMillis() - t0);
processRecords(warnings);
}
@ -542,8 +548,8 @@ public class CurrentWarnings {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
e);
}
System.out.println("Time to prepare " + records.size()
+ " records = " + (System.currentTimeMillis() - t0) + "ms");
perfLog.logDuration("Prepare " + records.size() + " records",
System.currentTimeMillis() - t0);
}
return prepared;

View file

@ -68,6 +68,7 @@ import com.vividsolutions.jts.geom.Geometry;
* Mar 04, 2014 2832 njensen Moved disposeInternal() to abstract class
* Apr 07, 2014 2959 njensen Correct handling of color change
* Apr 14, 2014 DR 17257 D. Friedman Redo time matching on per-minute refresh.
* Apr 28, 2015 ASM #15008 D. Friedman Create polygon for EXTs even if original product is not found.
*
* </pre>
*
@ -268,9 +269,11 @@ public class WarningsResource extends AbstractWWAResource {
}
}
}
// create the new polygon for the CON outside of the above
// for loop
if (createShape != null) {
/* Create a new polygon for the follow-up to the original
* product found in the above loop. Also create a polygon
* for EXT actions even if the original was not found.
*/
if (createShape != null || act == WarningAction.EXT) {
initShape(target, warnrec);
}
} else {

View file

@ -0,0 +1,76 @@
#!/bin/bash
##
# 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.
##
# Issue: #4462 Update script to update stdtextprodcts entries with blank site values.
#
# This script will modify table stdtextproducts in the fxatext.public schema.
#
PSQL="/awips2/psql/bin/psql"
if [ ${#1} != 4 ] ; then
echo "ERROR: First argument must be local site to use in the stdtextproducts table. Example: KOAX"
exit 1
else
siteId=${1}
siteLtr=${siteId:0:1}
fi
if [ ! -f ${PSQL} ];
then
echo "ERROR: The PSQL executable does not exist - ${PSQL}."
echo "FATAL: Update Failed!"
exit 1
fi
UPDATE_BY_XXX="update public.stdtextproducts set site = '${siteLtr}' || xxxid where site='' and xxxid not like '% ';"
UPDATE_LOC_SITE="update public.stdtextproducts set site='${siteId}' where site='' and xxxid like '% ';"
function updateXXXentries
{
echo "INFO: Updating stdtextproducts using xxxid"
${PSQL} -U awips -d fxatext -a -c "${UPDATE_BY_XXX}"
if [ $? -ne 0 ];
then
echo "FATAL: Update by xxxid Failed!"
exit 1
fi
echo "INFO: Completed updating stdtextproducts using xxxid."
}
function updateSITEentries
{
echo "INFO: Updating stdtextproduct table's site using local site."
${PSQL} -U awips -d fxatext -a -c "${UPDATE_LOC_SITE}"
if [ $? -ne 0 ];
then
echo "FATAL: unable to update stdtextproducts using local site."
exit 1
fi
echo "INFO: Finish updating stdtextproducts using local site."
}
echo "INFO: start update stdtextproducts"
updateXXXentries
updateSITEentries
echo "INFO: finish update stdtextproducts"
exit 0

View file

@ -22,8 +22,8 @@ package com.raytheon.edex.plugin.gfe.isc;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@ -31,11 +31,20 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.server.IFPServer;
import com.raytheon.uf.common.dataplugin.gfe.request.IscDataRecRequest;
import com.raytheon.uf.common.python.concurrent.IPythonJobListener;
import com.raytheon.uf.common.python.concurrent.PythonJobCoordinator;
@ -44,7 +53,6 @@ import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.common.util.file.FilenameFilters;
import com.raytheon.uf.edex.site.SiteAwareRegistry;
/**
* ISC data receive service. Takes incoming request and executes iscDataRec
@ -60,6 +68,7 @@ import com.raytheon.uf.edex.site.SiteAwareRegistry;
* Mar 12, 2013 #1759 dgilling Re-implement using IscScript.
* Mar 14, 2013 #1794 djohnson Consolidate common FilenameFilter implementations.
* Dec 10, 2014 #4953 randerso Properly handle single file reception
* May 06, 2015 #4383 dgilling Properly XML parse incoming XML file.
*
* </pre>
*
@ -68,9 +77,12 @@ import com.raytheon.uf.edex.site.SiteAwareRegistry;
*/
public class IscReceiveSrv {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(IscReceiveSrv.class);
private static final String ISC_REQUEST = "iscrequest";
private static final String METHOD_NAME = "main";
private static final FilenameFilter docFileFilter = FilenameFilters
@ -113,6 +125,9 @@ public class IscReceiveSrv {
} catch (GfeConfigurationException e) {
statusHandler.error("Error getting GFE configuration", e);
return;
} catch (SAXException | ParserConfigurationException e) {
statusHandler.error("Error parsing received XML file.", e);
return;
}
for (Entry<String, String[]> siteArgs : siteArgMap.entrySet()) {
@ -132,7 +147,9 @@ public class IscReceiveSrv {
}
private Map<String, String[]> prepareIscDataRec(String[] args)
throws IOException, InterruptedException, GfeConfigurationException {
throws IOException, InterruptedException,
GfeConfigurationException, SAXException,
ParserConfigurationException {
Map<String, String[]> siteMap = new HashMap<String, String[]>();
String[] incomingFiles = args[2].split(",");
@ -145,26 +162,21 @@ public class IscReceiveSrv {
xmlFileName = incomingFiles[1];
}
// TODO properly decode the xml
final File incomingXMLFile = new File(xmlFileName);
String fileContents = FileUtil.file2String(incomingXMLFile);
Pattern siteTagRegEx = Pattern.compile("<site>(.*?)</site>");
Matcher matcher = siteTagRegEx.matcher(fileContents);
List<String> siteList = new ArrayList<String>();
while (matcher.find()) {
siteList.add(matcher.group(1));
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(incomingXMLFile);
doc.getDocumentElement().normalize();
List<String> activeSites = Arrays.asList(SiteAwareRegistry
.getInstance().getActiveSites());
if (fileContents.contains("<iscrequest>")) {
// Need to copy the request file if more than 1 site is active
// on this EDEX server. Otherwise, the file will be deleted
// after the first site has processed the request file
siteList.remove(siteList.size() - 1);
Collection<String> siteList = getXMLDestinations(doc);
Set<String> activeSites = IFPServer.getActiveSites();
for (int i = 0; i < siteList.size(); i++) {
final String siteId = siteList.get(i);
if (ISC_REQUEST.equals(doc.getDocumentElement().getNodeName())) {
/*
* This case is for processing an ISC Request/Reply message
* requesting our site's grids.
*/
for (String siteId : siteList) {
if (activeSites.contains(siteId)) {
if (IFPServerConfigManager.getServerConfig(siteId)
.requestISC()) {
@ -180,11 +192,8 @@ public class IscReceiveSrv {
}
incomingXMLFile.delete();
} else {
// Remove the source site
siteList.remove(0);
Set<String> siteSet = new HashSet<String>(siteList);
try {
for (String site : siteSet) {
for (String site : siteList) {
if (activeSites.contains(site)
&& IFPServerConfigManager.getServerConfig(site)
.requestISC()) {
@ -272,4 +281,46 @@ public class IscReceiveSrv {
return siteMap;
}
private Collection<String> getXMLDestinations(final Document doc)
throws SAXException, IOException, ParserConfigurationException {
Collection<String> destinations = new HashSet<>();
// Expected XML format:
// <isc>
// <source></source>
// <destinations>
// <address>
// <site>SITE_ID</site>
// </address>
// </destinations>
// </isc>
NodeList destNodes = doc.getElementsByTagName("destinations");
if (destNodes.getLength() > 0) {
Node destNode = destNodes.item(0);
if (destNode.getNodeType() == Node.ELEMENT_NODE) {
Element destElement = (Element) destNode;
NodeList addrNodes = destElement
.getElementsByTagName("address");
for (int i = 0; i < addrNodes.getLength(); i++) {
Node addrNode = addrNodes.item(i);
if (addrNode.getNodeType() == Node.ELEMENT_NODE) {
Element addrElement = (Element) addrNode;
NodeList siteIdNodes = addrElement
.getElementsByTagName("site");
if (siteIdNodes.getLength() > 0) {
Node siteIDNode = siteIdNodes.item(0);
String siteID = siteIDNode.getTextContent();
destinations.add(siteID);
}
}
}
}
}
return destinations;
}
}

View file

@ -97,9 +97,8 @@
<alias base="GFS161">gfs161</alias>
<alias base="GFS199">gfs161</alias>
<alias base="RUC130">ruc130</alias>
<alias base="RTMA">rtmaNDFD</alias>
<alias base="RTMA25">rtmaNDFD</alias>
<alias base="URMA25">urmaNDFD</alias>
<alias base="RTMA-Mosaic">rtmaNDFD</alias>
<alias base="AK-RTMA">aKrtmaNDFD</alias>
<alias base="NamDNG5">NamDNG5</alias>
<alias base="GlobalWave">GlobalWave</alias>
@ -143,8 +142,6 @@
<alias base="SREF243">sref243</alias>
<alias base="RTGSST">RTGSST235</alias>
<alias base="GFSGuide">gfsGuide232</alias>
<alias base="RTMA">rtmaNDFD</alias>
<alias base="RTMA-Mosaic">rtmaNDFD</alias>
<alias base="AK-RTMA">aKrtmaNDFD</alias>
<alias base="AK-RTMA3">aKrtmaNDFD</alias>
<alias base="HI-RTMA">HIrtmaNDFD</alias>

View file

@ -333,6 +333,7 @@
<alias base="tp6c6">tp6c6</alias>
<alias base="tp6c7">tp6c7</alias>
<alias base="tp6c8">tp6c8</alias>
<alias base="TCCerranl">tccerranl</alias>
<alias base="TP6mean">tpmean6</alias>
<alias base="TP6sprd">tpsprd6</alias>
<alias base="TP-ECMWF">tpecmwf</alias>

View file

@ -65,7 +65,7 @@
# being off
# being off
# 04/20/2015 #4414 dgilling Add missing NWPSTrkngCG0 weather elements.
#
# 05/12/2015 #17144 bhunder Added RTMA model
########################################################################
#----------------------------------------------------------------------------
@ -316,6 +316,8 @@ VisUnc = ("VisUnc", SCALAR, "SM", "Vsby Anl Uncertainty", 10.0, 0.0, 2, NO)
PressUnc = ("PressUnc", SCALAR, "Pa", "Press Anl Uncertainty", 110000.0, 0.0, 2, NO)
Pressure = ("Pressure", SCALAR, "Pa", "Pressure", 110000.0, 0.0, 2, NO)
WGustUnc = ("WGustUnc", SCALAR, "kts", "WGust Anl Uncertainty", 12.0, 0.0, 0, NO)
# DR 17144
SkyUnc = ("SkyUnc", SCALAR, "%", "Sky Uncertainty", 100.0, 0.0, 0, NO)
# NamDNG5 parms
QPF3 = ("QPF3", SCALAR, "in", "3HR QPF", 3.0, 0.0, 2, YES)
@ -1307,7 +1309,8 @@ elif SID in CONUS_EAST_SITES:
('nwpsCG1', 'nwpsCG1'),
('nwpsTrkngCG0', 'nwpsTrkngCG0'),
'MOSGuide',
'RTMA',
##############DR17144
('RTMA25', 'RTMA'),
'NamDNG5',
('TPCWindProb','TPCProb'),
('SREF212', 'SREF'),
@ -1384,7 +1387,8 @@ else: #######DCS3501 WEST_CONUS
('nwpsCG1', 'nwpsCG1'),
('nwpsTrkngCG0', 'nwpsTrkngCG0'),
'MOSGuide',
'RTMA',
#######DR17144
('RTMA25', 'RTMA'),
'NamDNG5',
('TPCWindProb','TPCProb'),
('SREF212', 'SREF'),
@ -2065,17 +2069,17 @@ TPCTCM_MODEL = [([HiWind], TC3)]
# RTMA database parameter groupings
#if SID in ALASKA_SITES: - not sure if this is right
# DCS17288
# DCS17288/DR17144
if SID in ALASKA_SITES or SID in ["HFO", "SJU"]:
RTMAPARMS = [([Temp,Td,RH,Wind,Vis,Pressure,WindGust],TC1),
([MinT],MinTTC), ([MaxT],MaxTTC),
([MinRH],MinRHTC), ([MaxRH],MaxRHTC),
([TUnc,TdUnc,WSpdUnc,WDirUnc,VisUnc,PressUnc,WGustUnc],TC1)]
([TUnc,TdUnc,WSpdUnc,WDirUnc,VisUnc,PressUnc,WGustUnc,SkyUnc],TC1)]
else:
RTMAPARMS = [([Temp,Td,RH,Wind,QPE,Sky,Vis,Pressure,WindGust],TC1),
([MinT],MinTTC), ([MaxT],MaxTTC),
([MinRH],MinRHTC), ([MaxRH],MaxRHTC),
([TUnc,TdUnc,WSpdUnc,WDirUnc,VisUnc,PressUnc,WGustUnc],TC1)]
([TUnc,TdUnc,WSpdUnc,WDirUnc,VisUnc,PressUnc,WGustUnc,SkyUnc],TC1)]
# NamDNG5 database parameter groupings
NamDNG5PARMS = [([Temp, Td, RH, Wind, Sky, WindGust, Vis], TC3),

View file

@ -200,11 +200,11 @@ def execIscDataRec(MSGID,SUBJECT,FILES):
elif SUBJECT == 'GET_ACTIVE_TABLE2':
IrtServer.getVTECActiveTable(dataFile, xmlFileBuf)
elif SUBJECT in ['ISCGRIDS', 'ISCGRIDS2']:
import localConfig
import serverConfig
additionalISCRouting = []
if localConfig.AdditionalISCRouting:
additionalISCRouting = localConfig.AdditionalISCRouting
if serverConfig.AdditionalISCRouting:
additionalISCRouting = serverConfig.AdditionalISCRouting
putISCGrids(dataFile, siteConfig.GFESUITE_SITEID, srcServer.get('site'), additionalISCRouting)
elif SUBJECT == 'ISCREQUEST':
IrtServer.serviceISCRequest(dataFile)

View file

@ -100,6 +100,21 @@
<level>EA</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>tccerranl</short_name>
<long_name>Total Cloud Cover error analysis</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ErrorAnalysisCloud</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>EA</levelsDesc>
<levels>
<level>EA</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>tp</short_name>
<long_name>total precipitation</long_name>

View file

@ -1065,25 +1065,21 @@ class Forecaster(GridUtilities):
LogStream.logEvent(msg)
try:
rval = apply(mthd, tuple(gargs))
rval = apply(mthd, tuple(gargs))
if rval is not None:
if type(rval) is not ndarray:
if type(rval) is not tuple:
jrval = rval
rval = rval.__numpy__
if len(rval) == 1:
if rval[0].dtype != int8:
if type(rval) is not ndarray and rval is not None:
if type(rval) is not tuple:
jrval = rval
rval = rval.__numpy__
if len(rval) == 1:
if rval[0].dtype != int8:
# scalar
rval = rval[0]
else:
else:
# discrete or weather
keys = JUtil.javaObjToPyVal(jrval.getKeyList())
rval.append(keys)
cache[we] = (rval, time)
else:
cache[we] = (None, time)
cache[we] = (rval, time)
if rval is not None and cache['mtime'][0] is not None and doStore:
parm = self.__getNewWE(we)

View file

@ -52,6 +52,12 @@ class RTMAForecaster(Forecaster):
grid = tcc_EA
return clip(grid, 0, 100)
##--------------------------------------------------------------------------
## Sky Analysis Uncertainty
##--------------------------------------------------------------------------
def calcSkyUnc(self, tccerranl_EA):
grid = tccerranl_EA
return clip(grid, 0, 100)
##--------------------------------------------------------------------------
## T - change K to F
##--------------------------------------------------------------------------
def calcT(self, t_FHAG2):

View file

@ -17,6 +17,14 @@
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
#
# SOFTWARE HISTORY
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# May 01, 2015 17421 ryu Changed analysis methods for StormTotalSnow
#
##
#-------------------------------------------------------------------------
# Description: This product creates a ZFP-type series of text phrases
# for consecutive time periods for a list of edit areas. It can be
@ -475,7 +483,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis):
("PoP", self._PoP_analysisMethod("Period_1"), [3]),
("PoP", self.binnedPercent, [3]),
("SnowAmt", self.accumMinMax),
("StormTotalSnow", self.accumMinMax),
("StormTotalSnow", self.minMax),
("IceAccum", self.accumMinMax),
("SnowLevel", self.avg),
("Wind", self.vectorMedianRange, [6]),
@ -564,7 +572,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis):
("PoP", self._PoP_analysisMethod("Period_2_3"), [6]),
("PoP", self.binnedPercent, [6]),
("SnowAmt", self.accumMinMax),
("StormTotalSnow", self.accumMinMax),
("StormTotalSnow", self.minMax),
("IceAccum", self.accumMinMax),
("SnowLevel", self.avg),
("Wind", self.vectorMedianRange, [6]),
@ -791,7 +799,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis):
("PoP", self._PoP_analysisMethod("FirstFcstPeriod"), [6]),
("PoP", self.binnedPercent, [6]),
("SnowAmt", self.accumMinMax),
("StormTotalSnow", self.accumMinMax),
("StormTotalSnow", self.minMax),
("IceAccum", self.accumMinMax),
("SnowLevel", self.avg),
("Wind", self.vectorMedianRange, [6]),
@ -852,7 +860,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis):
("PoP", self._PoP_analysisMethod("AreaFcstPeriod"), [6]),
("PoP", self.binnedPercent, [6]),
("SnowAmt", self.accumMinMax),
("StormTotalSnow", self.accumMinMax),
("StormTotalSnow", self.minMax),
("IceAccum", self.accumMinMax),
("SnowLevel", self.avg),
("Wind", self.vectorMedianRange, [6]),

View file

@ -77,12 +77,12 @@
</info>
<info>
<title>GFS20-PAC</title>
<dataset>GFS-PAC-20KM</dataset>
<datasetId>GFS-PAC-20KM</datasetId>
<dt>3</dt>
</info>
<info>
<title>GFS20-PRICO</title>
<dataset>GFS-PRICO-20KM</dataset>
<datasetId>GFS-PRICO-20KM</datasetId>
<dt>3</dt>
</info>
<info>

View file

@ -45,6 +45,8 @@ import com.raytheon.uf.common.time.util.TimeUtil;
* Feb 12, 2014 2655 njensen Set source
* Jun 05, 2014 3226 bclement LightningStikePoint refactor
* Jun 10, 2014 3226 bclement fixed source
* May 8, 2015 DR17252 MPorricelli Removed setting of source.
* Source set in TextLightningParser.
*
* </pre>
*
@ -57,12 +59,6 @@ public class TextLightningDecoder extends AbstractDecoder implements
private String traceId = null;
/*
* inferred from Wufeng Zhou comment in BinLightningDecoderUtil, stands for
* World Wide Lightning Location Network
*/
private static final String SOURCE = "WWLLN";
/**
* Construct a TextLightning decoder. Calling hasNext() after construction
* will return false, decode() will return a null.
@ -103,8 +99,6 @@ public class TextLightningDecoder extends AbstractDecoder implements
report.setTraceId(traceId);
report.setSource(SOURCE);
return new PluginDataObject[] { report };
}

View file

@ -34,6 +34,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 3, 2014 3226 bclement Initial creation
* May 8, 2015 DR17252 MPorricelli Use HOUR_OF_DAY for setHour
*
* </pre>
*
@ -118,7 +119,7 @@ public class BaseLightningPoint {
* Hour of the day [0..23].
*/
public void setHour(int hour) {
this.time.set(Calendar.HOUR, hour);
this.time.set(Calendar.HOUR_OF_DAY, hour);
}
/**

View file

@ -162,4 +162,10 @@
install-size="0"
version="0.0.0"/>
<plugin
id="org.jfreechart"
download-size="0"
install-size="0"
version="0.0.0"/>
</feature>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<!--
Refer to edex/modes/README.txt for documentation
-->
<edexModes>
<mode name="ingestHydro">
<include>ndm-ingest.xml</include>
</mode>
</edexModes>

View file

@ -100,6 +100,7 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger;
* 10/16/2014 3454 bphillip Upgrading to Hibernate 4
* 10/28/2014 3454 bphillip Fix usage of getSession()
* Jan 27, 2015 4031 rferrel Resolve AFOS PILs site conflict using preferredAfosFirstLetter.
* May 05, 2015 4462 rferrel {@link #write(StdTextProduct)} when missing set the textProduct's site.
* </pre>
*
* @author garmendariz
@ -220,6 +221,22 @@ public class StdTextProductDao extends CoreDao {
prodId.setNnnid(nnn);
prodId.setXxxid(xxx);
Session session = this.getSession();
String site = textProduct.getProdId().getSite();
if ((site == null) || site.trim().isEmpty()) {
// Determine product site.
if (xxx.trim().length() == MAX_FIELD_LENGTH) {
site = SiteMap.getInstance().getSite4LetterId(xxx);
} else {
site = SiteMap.getInstance().getSite4LetterId(
SiteUtil.getSite());
}
if (logger.isInfoEnabled()) {
logger.info("Write \"" + ccc + nnn + xxx
+ "\" setting site to " + site);
}
textProduct.getProdId().setSite(site);
}
try {
try {
Query query = session.createQuery("SELECT refTime from "

View file

@ -39,6 +39,7 @@
#20140612 3230 rferrel Add pattern for URMA.
#20150121 4014 dgilling Add pattern for ETSS.
#20150202 4066 rferrel Add pattern form Earth Networks Total Lightning: SFPA42
#20150507 4434 skorolev Add pattern for GFS20
#***************************************************************
# AWIPS 1 PATTERN GRAPHIC ^[PQ].* /redbook/Raw
# PGNA00 KWNS 010001 !redbook 1_1/NMCGPHMCD/MCDSUM/PXSF001CN/20110201 0001
@ -171,6 +172,13 @@ HDS ^(O.[LN].{1,3}) (KWBM|KWBI) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([
HDS ^(OEBA88) KNWC (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([^/]*)/([0-9]{8})([0-9]{4})/(F[0-9]{3})/([^/]*)
FILE -overwrite -log -close -edex /data_store/\5/(\2:yyyy)(\2:mm)\2/\3/ICE/GRID\7/\9Z_\(10)_\(11)-\1_KNWC_\2\3\4_(seq).\5.%Y%m%d%H
# DR 17480 Add HFR (High Frequency Radar) Pattern
# Note: There isn't much metadata here to work with, if more is needed Unidata should be contacted.
# OUTA98 KWNB 111100 !grib2/
ANY ^(OUTA98) KWNB (..)(..)(..)[^!]*!(grib|grib2)
FILE -overwrite -log -close -edex /data_store/\5/(\2:yyyy)(\2:mm)\2/\3/HFR/\1_KWNB_\2\3\4_(seq).\5.%Y%m%d%H
# AWIPS1: GRID ^[YZ][UV]M.98.*KNHC /Grid/SBN/Raw
# *** NOT FOUND IN INGEST STREAM ***
@ -799,3 +807,13 @@ NGRID ^(MHU...) (KNHC) (..)(..)(..)
# ETSS-AK
NGRID ^(MHR...) (KNHC) (..)(..)(..)
FILE -overwrite -log -close -edex /data_store/grib2/(\3:yyyy)(\3:mm)\3/\4/ETSS/NDFD-AK/\1_\2_\3\4\5_(seq).grib2.%Y%m%d%H
#NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([^/]*)/([0-9]{8})([0-9]{4})(F[0-9]{3})/([^/]*)
# FILE -overwrite -log -close -edex /data_store/\6/(\3:yyyy)(\3:mm)\3/\4/\7/GRID\8/\(10)Z_\(11)_\(12)-\1_\2_\3\4\5_(seq).\6.%Y%m%d%H
# GFS20 - Alaska, Puerto Rico, Pacific and CONUS
# YUFC97 KWBC 051200 !grib2/ncep/GFS/#255/201505051200F012/UREL/2 K*m**2*kg-1*s-1
# ZONK67 KWBC 051200 !grib2/ncep/GFS/#215/201505051200F021/OMEG/675 hPa PRES
# ZVBK86 KWBC 051200 !grib2/ncep/GFS/#217/201505051200F021/VREL/180-150 hPa PDLY
NGRID ^([YZ][BCE-HMO-Y][BEFN][A-Z][0-9][0-9]) KWBC (..)(..)(..) [^!]*!(grib2)/[^/]*/([^/]*)/#([^/]*)/([0-9]{8})([0-9]{4})(F[0-9]{3})/([^/]*)
FILE -overwrite -log -close -edex /data_store/grib2/(\2:yyyy)(\2:mm)\2/\3/\6/GRID\7/\9Z_\(10)_\(11)_\1_KWBC_\2\3\4_(seq).\5.%Y%m%d%H