Merge branch 'master_14.4.1' into field_14.4.1

Conflicts:
	cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/formatterlauncher/ProductEditorComp.java
	cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/formatterlauncher/StyledTextComp.java

Change-Id: I1d6fac5acc7e468e2ff5f79869201018d849d209

Former-commit-id: 420132b396 [formerly 420132b396 [formerly f6b3765fc1670db2b9ceef75be7422a07b2badcf]]
Former-commit-id: 6191c93a9c
Former-commit-id: d8b54a59cf
This commit is contained in:
Ana Rivera 2015-02-11 22:00:40 +00:00
commit 85de48c8bf
101 changed files with 5845 additions and 4949 deletions

View file

@ -175,11 +175,11 @@
<ini-substitutions>
<max-memory>
<value>256M</value>
<value>384M</value>
</max-memory>
<max-perm>
<value>64M</value>
<value>96M</value>
</max-perm>
</ini-substitutions>
</memory-setting>

Binary file not shown.

View file

@ -65,6 +65,7 @@ import com.raytheon.viz.grid.rsc.general.D2DGridResource;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 5, 2014 3026 mpduff Initial creation
* Dec 16, 2014 3026 mpduff Change location of text
*
* </pre>
*
@ -121,7 +122,7 @@ public class HpeLabelResource extends
.getResourcesByTypeAsType(D2DGridResource.class);
if (!list.isEmpty()) {
double[] pixel = paintProps.getView().getDisplayCoords(
new double[] { 125, 50 }, target);
new double[] { 125, 100 }, target);
RGB color = getCapability(ColorableCapability.class).getColor();
for (D2DGridResource rsc : list) {
GridRecord currentGridRec = rsc.getCurrentGridRecord();

View file

@ -32,7 +32,8 @@ import com.raytheon.uf.common.dataplugin.grid.dataset.DatasetInfoLookup;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 6, 2014 3026 mpduff Initial creation
* May 6, 2014 3026 mpduff Initial creation.
* Jan 6, 2015 3026 mpduff Added Bias HPE.
*
* </pre>
*
@ -43,6 +44,8 @@ import com.raytheon.uf.common.dataplugin.grid.dataset.DatasetInfoLookup;
public class HpeUtils {
private static final String HPE = "HPE";
private static final String BIAS_HPE = "BiasHPE";
/**
* Determine if this title represents an HPE model.
*
@ -64,6 +67,7 @@ public class HpeUtils {
if (title == null) {
return false;
}
return HPE.equals(title);
return HPE.equals(title) || BIAS_HPE.equals(title);
}
}

View file

@ -198,6 +198,7 @@ import com.vividsolutions.jts.geom.Point;
* assignments.
* Sep 23, 2014 3009 njensen Overrode recycleInternal()
* Nov 10, 2014 3026 dhladky HPE BIAS displays.
* Dec 16, 2014 3026 mpduff Change location of text
* </pre>
*
* @author dhladky
@ -1495,7 +1496,7 @@ public class FFMPResource extends
private void paintProductString(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
double[] pixel = paintProps.getView().getDisplayCoords(
new double[] { 110, 50 }, target);
new double[] { 110, 100 }, target);
StringBuilder sb = new StringBuilder();
if (isAutoRefresh || isQuery) {
sb.append("FFMP ").append(df.format(getTime())).append(" hour ")
@ -4171,8 +4172,9 @@ public class FFMPResource extends
}
/**
* This method creates the upper left legend text for HPE derived QPE sources.
* It is only used for HPE QPE sources.
* This method creates the upper left legend text for HPE derived QPE
* sources. It is only used for HPE QPE sources.
*
* @param date
* @return
*/
@ -4190,18 +4192,18 @@ public class FFMPResource extends
}
/**
* HPE source lookup job
* HPE source lookup job
*
* <pre>
*
*
* SOFTWARE HISTORY
*
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Nov 11, 2014 3026 dhladky Initial creation
*
*
* </pre>
*
*
* @author dhladky
* @version 1.0
*/

View file

@ -28,12 +28,12 @@ import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import com.raytheon.uf.common.inventory.exception.DataCubeException;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
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.inventory.exception.DataCubeException;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
@ -62,6 +62,7 @@ import com.raytheon.viz.grid.util.RadarAdapter;
* Dec 13, 2011 bsteffen Initial creation
* Feb 21, 2014 DR 16744 D. Friedman Add radar/grid updates
* Apr 1, 2014 DR 17220 D. Friedman Handle uninitialized grid inventory
* Dec 15, 2014 3923 bsteffen Retrieve pdo for grid instead of dataURI.
*
* </pre>
*
@ -179,14 +180,14 @@ public class ThinClientDataUpdateTree extends DataUpdateTree {
newQuery.put("insertTime", new RequestConstraint(time,
ConstraintType.GREATER_THAN));
dbRequest.setConstraints(newQuery);
dbRequest.addRequestField("dataURI");
DbQueryResponse response = null;
try {
response = (DbQueryResponse) ThriftClient.sendRequest(dbRequest);
for (String dataURI : response.getFieldObjects("dataURI",
String.class)) {
for (PluginDataObject pdo : response
.getEntityObjects(PluginDataObject.class)) {
AlertMessage am = new AlertMessage();
am.dataURI = dataURI;
am.dataURI = pdo.getDataURI();
am.decodedAlert = RecordFactory.getInstance().loadMapFromUri(
am.dataURI);
messages.add(am);

View file

@ -32,6 +32,7 @@
# 11/20/2013 2488 randerso Changed to use DejaVu fonts
# 05/28/2014 2841 randerso Added separate configurable limits for
# text formatter and product script tasks
# 02/04/2015 17039 ryu Removed HighlightFramingCodes setting.
GFESUITE_HOME = "/awips2/GFESuite"
GFESUITE_PRDDIR = "/tmp/products"
@ -759,10 +760,6 @@ QPF_SetValue_zoom = 10
# Edited Data" on the dialog. The default if not specified is "By Gaps".
#InterpolateDialogMode = "Gaps"
# In Formatter Launcher, whether to highlight framing codes and the
# text enclosed by them in the text editor component.
HighlightFramingCodes = no
#------------------------------------------------------------------------
# Weather Element Configuration

View file

@ -1,35 +1,170 @@
# Version 2014.11.21-0
# Version 2014.12.17-0
import GenericHazards
import JsonSupport
import LocalizationSupport
import string, time, os, errno, re, types, copy, collections
import LogStream, ModuleAccessor, SampleAnalysis, EditAreaUtils
import math
import pprint
try: # See if this is the AWIPS I environment
import AFPS
from AFPS import AbsTime
from IFPDialog import Dialog
AWIPS_ENVIRON = "AWIPS1"
except: # Must be the AWIPS II environment
from AbsTime import *
from StartupDialog import IFPDialog as Dialog
from LockingFile import File
from com.raytheon.uf.common.localization import PathManagerFactory
from com.raytheon.uf.common.localization import LocalizationContext_LocalizationType as LocalizationType
AWIPS_ENVIRON = "AWIPS2"
from AbsTime import *
from StartupDialog import IFPDialog as Dialog
from LockingFile import File
AWIPS_ENVIRON = "AWIPS2"
class TextProduct(GenericHazards.TextProduct):
Definition = copy.deepcopy(GenericHazards.TextProduct.Definition)
def __init__(self):
GenericHazards.TextProduct.__init__(self)
self._pp = pprint.PrettyPrinter()
######################################################
# Populate Product Parts for HLS and TCV
######################################################
###############################################################
### Hazards and Additional Hazards
### allowedHazards is used for VTEC records and summary
### headlines
### allowedHeadlines are additional hazards reported in
### certain sections
###############################################################
###############################################################
### Initialization
###############################################################
###############################################################
### Analysis Lists, SampleAnalysis Overrides and other
### analysis related methods
###############################################################
###############################################################
### Product Parts Implementation
###############################################################
###############################################################
### Product Dictionary methods for creating, populating and
### formatting the product dictionary
###############################################################
###############################################################
### Sampling and Statistics related methods
###############################################################
###############################################################
### Area, Zone and Segment related methods
###############################################################
###############################################################
### Hazards related methods
###############################################################
###############################################################
### Time related methods
###############################################################
###############################################################
### Storm Information and TCP related methods
###############################################################
###############################################################
### Advisory related methods
###############################################################
###############################################################
### GUI related methods
###############################################################
###############################################################
### Hazards and Additional Hazards
def allowedHazards(self):
tropicalActions = ["NEW", "EXA", "CAN", "CON"]
return [
('HU.A',tropicalActions,'Hurricane'),
('HU.W',tropicalActions,'Hurricane'),
('SS.A',tropicalActions,'Surge'),
('SS.W',tropicalActions,'Surge'),
('TR.A',tropicalActions,'Tropical'),
('TR.W',tropicalActions,'Tropical'),
]
def allowedHeadlines(self):
allActions = ["NEW", "EXA", "EXB", "EXT", "CAN", "CON", "EXP"]
return [
('FF.A', allActions, 'Flood'), # FLASH FLOOD WATCH
('FA.A', allActions, 'Flood'), # FLOOD WATCH
('TO.A', allActions, 'Convective'), # TORNADO WATCH
]
###############################################################
### Initialization
def _initializeVariables(self, argDict):
# Get variables
error = self._getVariables(argDict)
if error is not None:
return error
self._backupFullStationID = self._fullStationID
self._argDict = argDict
argDict["definition"] = self._definition
self._initializeTimeVariables(argDict)
self._initializeHazardsTable(argDict)
error = self._initializeStormInformation()
if error is not None:
return error
# Set up the areaDictionary for all to use
accessor = ModuleAccessor.ModuleAccessor()
self._areaDict = accessor.variable(self._areaDictionary, "AreaDictionary")
self._tpc = TextProductCommon()
self._tpc.setUp(self._areaDict)
return None
###############################################################
### Analysis Lists, SampleAnalysis Overrides and other
### analysis related methods
def moderated_dict(self, parmHisto, timeRange, componentName):
"""
Specifies the lower percentages and upper percentages of
data to be thrown out for moderated stats.
"""
# COMMENT: This dictionary defines the low and high limit at which
# outliers will be removed when calculating moderated stats.
# By convention the first value listed is the percentage
# allowed for low values and second the percentage allowed
# for high values.
# Get Baseline thresholds
dict = SampleAnalysis.SampleAnalysis.moderated_dict(
self, parmHisto, timeRange, componentName)
# Change thresholds
dict["Wind"] = (0, 15)
dict["WindGust"] = (0, 15)
dict["pws34int"] = (0, 5)
dict["pws64int"] = (0, 5)
dict["pwsD34"] = (0, 5)
dict["pwsN34"] = (0, 5)
dict["pwsD64"] = (0, 5)
dict["pwsN64"] = (0, 5)
dict["InundationMax"] = (0, 5)
dict["InundationTiming"] = (0, 5)
return dict
###############################################################
### Product Parts Implementation
################# Product Level
def _wmoHeader(self, productDict, productSegmentGroup, arguments=None):
headerDict = collections.OrderedDict()
headerDict['TTAAii'] = self._wmoID
@ -55,7 +190,193 @@ class TextProduct(GenericHazards.TextProduct):
headerDict['issuedByString'] = self.getIssuedByString()
headerDict['issuanceTimeDate'] = self._timeLabel
productDict['productHeader'] = headerDict
################# Mixed Level
def _ugcHeader(self, productDict, productSegmentGroup, productSegment):
productDict['ugcCodes'] = self._formatUGC_entries()
self._ugcHeader_value = self._tpc.formatUGCs(self._ugcs, self._expireTime)
productDict['ugcHeader'] = self._ugcHeader_value
################# Product Parts Processing
def _processProductParts(self, productGenerator, productDict, productSegmentGroup, productParts):
'''
@param productDict
@param productSegmentGroup
@param productParts
@return product dictionary created from the product parts
Note that this method is called recursively such that a product part is allowed to be
a set of subParts specified as follows:
(subPartLabel, list of productParts for each subPart)
For example, we have
('segments', [list of [segment product parts]])
# Product Dictionary
# Contains information for all formats e.g.
# partner XML, CAP, and Legacy text
'''
if type(productParts) is types.DictType:
arguments = productParts.get('arguments')
partsList = productParts.get('partsList')
else:
partsList = productParts
removedParts = []
for part in partsList:
if type(part) is types.TupleType:
# e.g. subPart == 'segments', subPartsLists == list of parts for each segment
subPart, subPartsLists = part
subParts = []
for subPartsList in subPartsLists:
subDict = collections.OrderedDict()
self._processProductParts(productGenerator, subDict, productSegmentGroup, subPartsList)
subParts.append(subDict)
# e.g. productDict['segments'] = segment dictionaries
productDict[subPart] = subParts
else:
if part not in self._noOpParts():
execString = 'productGenerator._'+part+'(productDict, productSegmentGroup, arguments)'
exec execString
if part not in productDict:
removedParts.append(part)
for part in removedParts:
self.debug_print("in _processProductParts - " +
"Removing product part = %s" % (part), 1)
partsList.remove(part)
################# Product Parts Helper Methods
def _formatUGC_entries(self):
ugcCodeList = []
for ugc in self._ugcs:
areaDictEntry = self._areaDict.get(ugc)
if areaDictEntry is None:
# We are not localized correctly for the hazard
# So get the first dictionary entry
self.logger.info('Not Localized for the hazard area -- ugc' + ugc)
keys = self._areaDict.keys()
areaDictEntry = self._areaDict.get(keys[0])
ugcEntry = collections.OrderedDict()
ugcEntry['state'] = areaDictEntry.get('stateAbbr')
ugcEntry['type'] = self._getUgcInfo(ugc, 'type')
ugcEntry['number'] = self._getUgcInfo(ugc, 'number')
ugcEntry['text'] = ugc
ugcEntry['subArea'] = ''
ugcCodeList.append(ugcEntry)
return ugcCodeList
def _getUgcInfo(self, ugc, part='type'):
if part == 'type':
if ugc[2] == 'C':
return 'County'
else:
return 'Zone'
if part == 'number':
return ugc[3:]
###############################################################
### Product Dictionary methods for creating, populating and
### formatting the product dictionary
def _createProductDictionary(self, segmentList):
# Create the product dictionary
productSegmentGroup = self._groupSegments(segmentList)
productDict = self._initializeProductDictionary(productSegmentGroup)
productParts = productSegmentGroup.get('productParts')
productDict['productParts'] = productParts
self._processProductParts(self, productDict, productSegmentGroup, productParts)
return productDict
def _initializeProductDictionary(self, productSegmentGroup):
'''
Set up the Product Dictionary for the given Product consisting of a
group of segments.
Fill in the dictionary information for the product header.
@param productSegmentGroup: holds meta information about the product
@return initialized product dictionary
***********
Example segmented product:
WGUS63 KBOU 080400
FFABOU
URGENT - IMMEDIATE BROADCAST REQUESTED
FLOOD WATCH
NATIONAL WEATHER SERVICE DENVER CO
400 AM GMT TUE FEB 8 2011
Overview Headline
Overview
***********
Example non-segmented product:
WGUS63 KBOU 080400
FFWBOU
'''
self._productID = productSegmentGroup.get('productID', 'NNN')
if self._areaName != '':
self._areaName = ' FOR ' + self._areaName + '\n'
self._geoType = productSegmentGroup.get('geoType')
self._mapType = productSegmentGroup.get('mapType')
self._productTimeZones = []
# Fill in product dictionary information
productDict = collections.OrderedDict()
productDict['productID'] = self._productID
return productDict
def _formatProductDictionary(self, formatterClass, productDict):
formatter = formatterClass(self)
product = formatter.execute(productDict)
return product
###############################################################
### Sampling and Statistics related methods
def _getStatValue(self, statDict, element, method=None, dataType=None):
stats = statDict.get(element, None)
if stats is None: return None
if type(stats) is types.ListType:
stats = stats[0]
stats, tr = stats
if dataType==self.VECTOR():
stats, dir = stats
return self.getValue(stats, method)
###############################################################
### Area, Zone and Segment related methods
def _allAreas(self):
return self._inlandAreas() + self._coastalAreas()
def _computeIntersectAreas(self, editAreas, argDict):
editAreaUtils = EditAreaUtils.EditAreaUtils()
editAreaUtils.setUp(None, argDict)
surgeEditArea = editAreaUtils.getEditArea("StormSurgeWW_EditArea", argDict)
intersectAreas =[]
for (_, editAreaLabel) in editAreas:
editArea = editAreaUtils.getEditArea(editAreaLabel, argDict)
intersectAreaLabel = "intersect_"+editAreaLabel
intersectArea = editAreaUtils.intersectAreas(intersectAreaLabel, editArea, surgeEditArea)
grid = intersectArea.getGrid()
if grid.isAnyBitsSet():
editAreaUtils.saveEditAreas([intersectArea])
intersectAreas.append((intersectAreaLabel, intersectAreaLabel))
return intersectAreas
###############################################################
### Hazards related methods
@ -72,31 +393,60 @@ class TextProduct(GenericHazards.TextProduct):
self._hazardsTable = self._getHazardsTable(argDict, self.filterMethod)
argDict["hazards"] = self._hazardsTable
def _setVTECActiveTable(self, argDict):
dataMgr = argDict["dataMgr"]
gfeMode = dataMgr.getOpMode().name()
if gfeMode == "PRACTICE":
argDict["vtecActiveTable"] = "PRACTICE"
else:
argDict["vtecActiveTable"] = "active"
def _getAllVTECRecords(self):
allRecords = []
for segment in self._segmentList:
vtecRecords = self._hazardsTable.getHazardList(segment)
allRecords += vtecRecords
return allRecords
def _getHazardsTable(self, argDict, filterMethod, editAreas=None):
# Set up edit areas as list of lists
# Need to check hazards against all edit areas in the CWA MAOR
argDict["combinations"]= [(self._allAreas(),"Region1")]
dfEditAreas = argDict["combinations"]
editAreas = []
for area, label in dfEditAreas:
if type(area) is types.ListType:
editAreas.append(area)
elif type(area) is types.TupleType: #LatLon
editAreas.append([self.__getLatLonAreaName(area)])
else:
editAreas.append([area])
# Get Product ID and other info for HazardsTable
pil = self._pil.upper() # Ensure PIL is in UPPERCASE
stationID4 = self._fullStationID
productCategory = pil[0:3] #part of the pil
definition = argDict['definition']
sampleThreshold = definition.get("hazardSamplingThreshold", (10, None))
# Process the hazards
accurateCities = definition.get('accurateCities', 0)
cityRefData = []
import HazardsTable
hazards = HazardsTable.HazardsTable(
argDict["ifpClient"], editAreas, productCategory, filterMethod,
argDict["databaseID"],
stationID4, argDict["vtecActiveTable"], argDict["vtecMode"], sampleThreshold,
creationTime=argDict["creationTime"], accurateCities=accurateCities,
cityEditAreas=cityRefData, dataMgr=argDict['dataMgr'])
return hazards
def _ignoreActions(self):
# Ignore hazards with these action codes in the overview headlines
# NOTE: the VTEC and segments will still include them correctly.
return ['CAN', 'UPG']
# In order to have the HazardsTable use the allowedHeadlines list,
# we need to supply a filterMethod that uses allowedHeadlines instead of allowedHazards
def _setVTECActiveTable(self, argDict):
dataMgr = argDict["dataMgr"]
gfeMode = dataMgr.getOpMode().name()
self.debug_print("*" *100, 1)
self.debug_print("gfeMode = '%s'" % (gfeMode), 1)
self.debug_print("*" *100, 1)
if gfeMode == "PRACTICE":
argDict["vtecActiveTable"] = "PRACTICE"
else:
argDict["vtecActiveTable"] = "active"
def _getVtecRecords(self, segment, vtecEngine=None):
vtecRecords = self._hazardsTable.getHazardList(segment)
return vtecRecords
def _getAllowedHazardList(self, allowedHazardList=None):
if allowedHazardList is None:
allowedHazardList = self.allowedHazards()
@ -107,7 +457,7 @@ class TextProduct(GenericHazards.TextProduct):
else:
hazardList.append(h)
return hazardList
def _altFilterMethod(self, hazardTable, allowedHazardsOnly=False):
# Remove hazards not in allowedHeadlines list
allowedHazardList = self._getAllowedHazardList(self.allowedHeadlines())
@ -156,15 +506,16 @@ class TextProduct(GenericHazards.TextProduct):
for area in hazard['id']:
hazDict.setdefault((hdln, phen, sig), []).append(area)
#self.debug_print("hazDict", hazDict
self.debug_print("hazDict = %s" % (self._pp.pformat(hazDict)), 1)
hazardHdlns=[]
huAreas = []
# self.debug_print("\nAdditional Hazard Headlines"
self.debug_print("Additional Hazard Headlines", 1)
for key in hazDict.keys():
hdln, phen, sig = key
huAreas = huAreas + hazDict[key]
hazardHdln = ((hdln, "NEW", phen,sig), hazDict[key], [],[],[])
#self.debug_print(" ", hazardHdln, hazDict[key]
self.debug_print(" %s" % (self._pp.pformat(hazardHdln)), 1)
self.debug_print(" %s" % (self._pp.pformat(hazDict[key])), 1)
hazardHdlns.append(hazardHdln)
return hazardHdlns, huAreas
@ -187,14 +538,12 @@ class TextProduct(GenericHazards.TextProduct):
# Otherwise, they are ignored.
#
# E.g. hdlnList = self._checkHazard(hazardHdlns, [("FA","W")], returnList=True)
self.debug_print("_checkHazard hazardHdlns is %s" % (hazardHdlns), 1)
self.debug_print("_checkHazard phenSigList is %s" % (phenSigList), 1)
self.debug_print("_checkHazard hazardHdlns is %s" % (self._pp.pformat(hazardHdlns)), 1)
self.debug_print("_checkHazard phenSigList is %s" % (self._pp.pformat(phenSigList)), 1)
chosen = []
for key, landList, marineList, coastalList, inlandList in hazardHdlns:
# self.debug_print("what is mode?", mode
# SARAH - we do not want to consider marine hazards in this product
# hazAreas = landList+marineList
# We do not want to consider marine hazards in this product
hazAreas = landList
hazValue = (key, hazAreas)
self.debug_print("hazValue is %s" % (repr(hazValue)), 1)
@ -209,10 +558,9 @@ class TextProduct(GenericHazards.TextProduct):
# Check for land, marine, etc.
for checkAreaType in checkAreaTypes:
exec "testList = " + checkAreaType + "List"
# self.debug_print("testList is", testList
self.debug_print("testList is %s" % (testList), 1)
if testList != []:
chosen.append(hazValue)
# self.debug_print("chosen is ", chosen
elif checkAreas is not None:
acceptedAreas=[]
for hazArea in hazAreas:
@ -224,46 +572,12 @@ class TextProduct(GenericHazards.TextProduct):
chosen.append(hazValue)
if not returnList and chosen!=[]: break
self.debug_print("MATT _checkHazard chosen = %s" % (repr(chosen)), 1)
self.debug_print("In _checkHazard chosen = %s" %
(self._pp.pformat(chosen)), 1)
if not returnList:
return chosen!=[]
return chosen
def getVtecRecords(self, segment, vtecEngine=None):
vtecRecords = self._hazardsTable.getHazardList(segment)
return vtecRecords
def _getHazardsTable(self, argDict, filterMethod, editAreas=None):
# Set up edit areas as list of lists
# Need to check hazards against all edit areas in the CWA MAOR
argDict["combinations"]= [(self._allAreas(),"Region1")]
dfEditAreas = argDict["combinations"]
editAreas = []
for area, label in dfEditAreas:
if type(area) is types.ListType:
editAreas.append(area)
elif type(area) is types.TupleType: #LatLon
editAreas.append([self.__getLatLonAreaName(area)])
else:
editAreas.append([area])
# Get Product ID and other info for HazardsTable
pil = self._pil.upper() # Ensure PIL is in UPPERCASE
stationID4 = self._fullStationID
productCategory = pil[0:3] #part of the pil
definition = argDict['definition']
sampleThreshold = definition.get("hazardSamplingThreshold", (10, None))
# Process the hazards
accurateCities = definition.get('accurateCities', 0)
cityRefData = []
import HazardsTable
hazards = HazardsTable.HazardsTable(
argDict["ifpClient"], editAreas, productCategory, filterMethod,
argDict["databaseID"],
stationID4, argDict["vtecActiveTable"], argDict["vtecMode"], sampleThreshold,
creationTime=argDict["creationTime"], accurateCities=accurateCities,
cityEditAreas=cityRefData, dataMgr=argDict['dataMgr'])
return hazards
###############################################################
### Time related methods
@ -278,7 +592,7 @@ class TextProduct(GenericHazards.TextProduct):
self._expireTime = self._issueTime_secs + self._purgeTime*3600
self._timeLabel = self.getCurrentTime(
argDict, "%l%M %p %Z %a %b %e %Y", stripLeading=1)
def _determineTimeRanges(self, argDict):
# Set up the time range for 0-120 hours
@ -298,12 +612,15 @@ class TextProduct(GenericHazards.TextProduct):
trList = []
self._periodList = []
for index, tr in enumerate(subRanges):
# self.debug_print(tr)
self.debug_print("In _determineTimeRanges -> tr = %s" %
(self._pp.pformat(tr)), 1)
trList.append((tr, "Label"))
if index == 0:
startTime = tr.startTime()
localtime = time.localtime(startTime.unixTime())
# Determine the number of hours to the next 6AM or 6PM period
if localtime.tm_hour < 6:
periodLength = 6 - localtime.tm_hour
elif localtime.tm_hour >= 6 and localtime.tm_hour < 18:
@ -311,6 +628,8 @@ class TextProduct(GenericHazards.TextProduct):
else:
periodLength = 30 - localtime.tm_hour
# Don't allow the first period to be less than 3 hours long;
# instead just start with the next period
if periodLength < 3:
periodStart = startTime + periodLength*3600
period = self.makeTimeRange(periodStart, periodStart+12*3600)
@ -318,10 +637,13 @@ class TextProduct(GenericHazards.TextProduct):
period = self.makeTimeRange(startTime, startTime+periodLength*3600)
self._periodList.append(period)
for i in range(1,10):
startTime = period.endTime() # Start where the last period leaves off
period = self.makeTimeRange(startTime, startTime+12*3600)
self._periodList.append(period)
self.debug_print("final periodList =\n\n%s\n" %
(self._pp.pformat(self._periodList)), 1)
self._timeRangeList = trList
def _calculateStartTime(self, localCreationTime):
@ -330,21 +652,21 @@ class TextProduct(GenericHazards.TextProduct):
day = localCreationTime[2]
hour = localCreationTime[3]
# If we are more than halfway though a 3 hr period
if hour % 3 > 1:
adjust = 3 # move on to the next 3 hr block
# Define a variable to control which resolution we want
resolution = self._resolution() # 6 is also a valid option
# If we are more than halfway though a block we would want
if hour % resolution > resolution / 2:
adjust = resolution # move on to the next block
else:
adjust = 0
# if hour % 6 > 3:
# adjust = 6 # move on to the next 6 hr block
# else:
# adjust = 0
# self.debug_print("MATT: _calculateStartTime %d adjust = %d" % (hour % 6, adjust)
self.debug_print("In _calculateStartTime %d adjust = %d" %
(hour % resolution, adjust), 1)
# Now "truncate" to a 6-hourly boundary and compute startTime in local Time.
# hour = int( (hour/6) * 6) + adjust
hour = int( (hour/3) * 3) + adjust
# Now "truncate" to a block boundary and compute startTime in local time.
# hour = int( (hour/3) * 3) + adjust
hour = int( (hour/resolution) * resolution) + adjust
if hour > 23:
hour -= 24
elif hour < 0:
@ -363,7 +685,7 @@ class TextProduct(GenericHazards.TextProduct):
# DAY + MORNING / AFTERNOON / EVENING / OVERNIGHT.
# If wholePeriod, format FROM ... TO...
self.debug_print("MATT Format period wholePeriod = %s, period = %s, useEndTime =%s" %
self.debug_print("Format period wholePeriod = %s, period = %s, useEndTime =%s" %
(str(wholePeriod), str(period), str(useEndTime)), 1)
if period is None:
return ""
@ -372,10 +694,10 @@ class TextProduct(GenericHazards.TextProduct):
else:
startTime = period.startTime()
result = self._getTimeDesc(startTime, resolution, shiftToLocal)
self.debug_print("MATT result = '%s'" % (result), 1)
self.debug_print("_getTimeDesc result = '%s'" % (result), 1)
if wholePeriod:
endResult = self._getTimeDesc(period.endTime(), resolution, shiftToLocal)
self.debug_print("MATT endResult = '%s'" % (endResult), 1)
self.debug_print("_getTimeDesc endResult = '%s'" % (endResult), 1)
if result != endResult:
result=result + " TO "+ endResult
return result
@ -445,69 +767,6 @@ class TextProduct(GenericHazards.TextProduct):
else: partOfDay = "evening"
return prevDay, partOfDay
###############################################################
### Sampling and Statistics related methods
def moderated_dict(self, parmHisto, timeRange, componentName):
"""
Specifies the lower percentages and upper percentages of
data to be thrown out for moderated stats.
"""
# COMMENT: This dictionary defines the low and high limit at which
# outliers will be removed when calculating moderated stats.
# By convention the first value listed is the percentage
# allowed for low values and second the percentage allowed
# for high values.
# Get Baseline thresholds
dict = SampleAnalysis.SampleAnalysis.moderated_dict(
self, parmHisto, timeRange, componentName)
# Change thresholds
dict["Wind"] = (0, 15)
dict["WindGust"] = (0, 15)
dict["pws34int"] = (0, 5)
dict["pws64int"] = (0, 5)
dict["pwsD34"] = (0, 5)
dict["pwsN34"] = (0, 5)
dict["pwsD64"] = (0, 5)
dict["pwsN64"] = (0, 5)
dict["InundationMax"] = (0, 5)
dict["InundationTiming"] = (0, 5)
return dict
def _getStatValue(self, statDict, element, method=None, dataType=None):
stats = statDict.get(element, None)
if stats is None: return None
if type(stats) is types.ListType:
stats = stats[0]
stats, tr = stats
if dataType==self.VECTOR():
stats, dir = stats
return self.getValue(stats, method)
###############################################################
### Area, Zone and Segment related methods
def _allAreas(self):
return self._inlandAreas() + self._coastalAreas()
def _computeIntersectAreas(self, editAreas, argDict):
editAreaUtils = EditAreaUtils.EditAreaUtils()
editAreaUtils.setUp(None, argDict)
surgeEditArea = editAreaUtils.getEditArea("StormSurgeWW_EditArea", argDict)
intersectAreas =[]
for (_, editAreaLabel) in editAreas:
editArea = editAreaUtils.getEditArea(editAreaLabel, argDict)
intersectAreaLabel = "intersect_"+editAreaLabel
intersectArea = editAreaUtils.intersectAreas(intersectAreaLabel, editArea, surgeEditArea)
grid = intersectArea.getGrid()
if grid.isAnyBitsSet():
editAreaUtils.saveEditAreas([intersectArea])
intersectAreas.append((intersectAreaLabel, intersectAreaLabel))
return intersectAreas
###############################################################
### Storm Information and TCP related methods
@ -758,16 +1017,21 @@ NEXT COMPLETE ADVISORY...500 AM EDT.
$$
FORECASTER STEWART"""
###############################################################
### Advisory related methods
def _initializeAdvisories(self):
self._currentAdvisory = dict()
self._currentAdvisory['ZoneData'] = dict()
self._loadLastTwoAdvisories()
def _synchronizeAdvisories(self):
pathManager = PathManagerFactory.getPathManager()
context = pathManager.getContextForSite(LocalizationType.CAVE_STATIC, self._site)
# Retrieving a directory causes synching to occur
file = pathManager.getLocalizationFile(context, self._getAdvisoryPath()).getFile()
file = LocalizationSupport.getLocalizationFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.SITE, self._site,
self._getAdvisoryPath()).getFile()
return file
@ -783,17 +1047,22 @@ FORECASTER STEWART"""
return path
def _loadLastTwoAdvisories(self):
def _getStormAdvisoryNames(self):
advisoryDirectoryPath = self._getLocalAdvisoryDirectoryPath()
filenames = os.listdir(advisoryDirectoryPath)
allAdvisories = filter(lambda filename: filename[-5:] == ".json", filenames)
self.debug_print("allAdvisories = %s" % (repr(allAdvisories)))
self.debug_print("allAdvisories = %s" % (self._pp.pformat(allAdvisories)))
stormAdvisories = filter(lambda filename: self._getStormNameFromTCP() in filename,
allAdvisories)
stormAdvisories = map(lambda filename: filename[:-5], stormAdvisories)
self.debug_print("stormAdvisories = %s" % (repr(stormAdvisories)))
self.debug_print("stormAdvisories = %s" % (self._pp.pformat(stormAdvisories)))
return stormAdvisories
def _loadLastTwoAdvisories(self):
stormAdvisories = self._getStormAdvisoryNames()
# We need to reverse the order of the advisories so the latest
# advisories come first in this list
@ -813,8 +1082,8 @@ FORECASTER STEWART"""
else: # Must be the HLS
lastTwoAdvisories = stormAdvisories[:2]
self.debug_print("MATT DEBUG: last two advisories = %s" %
(repr(lastTwoAdvisories)), 1)
self.debug_print("DEBUG: last two advisories = %s" %
(self._pp.pformat(lastTwoAdvisories)), 1)
self._previousAdvisory = None
if len(lastTwoAdvisories) >= 1:
self._previousAdvisory = self._loadAdvisory(lastTwoAdvisories[0])
@ -828,12 +1097,12 @@ FORECASTER STEWART"""
fileName = self._getAdvisoryFilename(advisoryName)
try:
pythonDict = JsonSupport.loadFromJson(LocalizationType.CAVE_STATIC,
pythonDict = JsonSupport.loadFromJson(LocalizationSupport.CAVE_STATIC,
self._site,
fileName)
self.debug_print("SARAH: File contents for %s:" % (fileName), 1)
self.debug_print(repr(pythonDict), 1)
self.debug_print("File contents for %s:" % (fileName), 1)
self.debug_print(self._pp.pformat(pythonDict), 1)
# Only use transmitted advisories
if pythonDict["Transmitted"] == False and advisoryName != "pending":
@ -841,8 +1110,7 @@ FORECASTER STEWART"""
else:
return pythonDict
except Exception, e:
self.debug_print("SARAH Load Exception for %s : %s" %
(fileName, e), 1)
self.debug_print("Load Exception for %s : %s" % (fileName, e), 1)
return None
def _getAdvisoryPath(self):
@ -857,7 +1125,7 @@ FORECASTER STEWART"""
advisoryFilename = os.path.join(self._getAdvisoryPath(),
advisoryName+".json")
return advisoryFilename
###############################################################
### GUI related methods
@ -899,48 +1167,7 @@ FORECASTER STEWART"""
"headers": ("blue", ("Helvetica", 14, "bold")),
"instructions": (None, ("Helvetica", 12, "italic")),
}
###############################################################
### TCV Statistics
def threatKeyOrder(self):
return [None, "None", "Elevated", "Mod", "High", "Extreme"]
def allowedHazards(self):
tropicalActions = ["NEW", "EXA", "CAN", "CON"]
return [
('HU.A',tropicalActions,'Hurricane'),
('HU.W',tropicalActions,'Hurricane'),
('SS.A',tropicalActions,'Surge'),
('SS.W',tropicalActions,'Surge'),
('TR.A',tropicalActions,'Tropical'),
('TR.W',tropicalActions,'Tropical'),
]
def allowedHeadlines(self):
allActions = ["NEW", "EXA", "EXB", "EXT", "CAN", "CON", "EXP"]
return [
('FF.A', allActions, 'Flood'), # FLASH FLOOD WATCH
('FA.A', allActions, 'Flood'), # FLOOD WATCH
('TO.A', allActions, 'Convective'), # TORNADO WATCH
]
def _initializeAdvisories(self):
self._currentAdvisory = dict()
self._currentAdvisory['ZoneData'] = dict()
self._loadLastTwoAdvisories()
def _initializeSegmentZoneData(self, segment):
# The current advisory will be populated when setting a section's stats
self._currentAdvisory['ZoneData'][segment] = {
"WindThreat": None,
"WindForecast": None,
"StormSurgeThreat": None,
"StormSurgeForecast": None,
"FloodingRainThreat": None,
"FloodingRainForecast": None,
"TornadoThreat": None,
}
import Tkinter
class Common_Dialog(Dialog):
@ -950,6 +1177,7 @@ class Common_Dialog(Dialog):
self._varDict = {} # all end results must be saved here
self._infoDict = infoDict
self._parent = parent
self._pp = pprint.PrettyPrinter()
Dialog.__init__(self, parent=None, title=title)
def getVarDict(self):

View file

@ -630,7 +630,7 @@ PotentialImpactStatements = {
},
}
EvacuationStatements = ["For those under evacuation orders, leave as soon as practical with a destination in mind. Gas up your vehicle well ahead of time. Be sure that you take essential materiasl from your Emergency Supplies Kit. Let others know where you are going and when you intend to arrive.",
EvacuationStatements = ["For those under evacuation orders, leave as soon as practical with a destination in mind. Gas up your vehicle well ahead of time. Be sure that you take essential materials from your Emergency Supplies Kit. Let others know where you are going and when you intend to arrive.",
"If evacuating the area, stick to prescribed evacuation routes. Look for additional traffic information on roadway smart signs and listen to select radio channels for further travel instructions. Do not use your cell phone while driving."
"For those not under evacuation orders, understand that there are inherent risks to evacuation (such as traffic congestion, accidents, and driving in bad weather), so evacuate only if necessary. Help keep roadways open for those that are under evacuation orders."]
@ -678,7 +678,6 @@ OtherPreparednessActions = {
"Problems with sewer backups can contaminate standing flood waters. Keep children away. Also, listen for boil water alerts relative to communities whose tap water may have become temporarily non-potable."],
}
AdditionalSources = ["- For information on appropriate preparations see ready.gov/louisiana",
"- For information on local evacuation shelters see www.emergency.louisana.gov/disaster_evaluation_guide.html",
AdditionalSources = ["- For information on appropriate preparations see ready.gov",
"- For information on creating an emergency plan see getagameplan.org",
"- For additional disaster preparedness information see redcross.org"]

View file

@ -164,6 +164,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* 12/16/2014 #14946 ryu Modified updateIssueExpireTimes() so issuance time is displayed
* for the local time zones for each segment.
* 01/28/2015 #4018 randerso Code cleanup.
* 02/04/2014 17039 ryu Removed menu item related to the HighlighFramingCodes feature.
*
* </pre>
*
* @author lvenable
@ -281,8 +283,6 @@ public class ProductEditorComp extends Composite implements
private MenuItem autoWrapMI;
private MenuItem framingCodeMI;
/**
* Date & time formatter.
*/
@ -876,20 +876,6 @@ public class ProductEditorComp extends Composite implements
}
});
framingCodeMI = new MenuItem(menuToAddTo, SWT.CHECK);
framingCodeMI.setText("Highlight Framing Codes");
framingCodeMI.setSelection(Activator.getDefault().getPreferenceStore()
.getBoolean("HighlightFramingCodes"));
framingCodeMI.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
textComp.setFramingCodeState(framingCodeMI.getSelection());
textComp.reParse();
}
});
MenuItem wrapLengthMI = new MenuItem(menuToAddTo, SWT.PUSH);
wrapLengthMI.setText("Wrap Length...");
wrapLengthMI.addSelectionListener(new SelectionAdapter() {

View file

@ -41,7 +41,6 @@ import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
@ -88,6 +87,8 @@ import com.raytheon.viz.gfe.textformatter.TextFmtParserUtil;
* 28 JAN 2015 4018 randerso Code cleanup. Fixed reparsing when framing codes are cut
* or pasted instead of just typed over.
* Added logging of text changes to help diagnose future issues.
* 04 FEB 2015 17039 ryu Removed HighlightFramingCodes feature which prevented
* editing of framing codes.
*
* </pre>
*
@ -152,9 +153,6 @@ public class StyledTextComp extends Composite {
*/
private Listener mouseListener;
private boolean highlight = Activator.getDefault().getPreferenceStore()
.getBoolean("HighlightFramingCodes");
private boolean newProduct = false;
private Set<String> unlockCitySegs;
@ -289,13 +287,6 @@ public class StyledTextComp extends Composite {
textEditorST.setBackground(bgColor);
textEditorST.setForeground(fgColor);
textEditorST.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent ke) {
handleKeyRelease(ke);
}
});
textEditorST.addVerifyListener(new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
@ -860,18 +851,6 @@ public class StyledTextComp extends Composite {
return false;
}
/**
* Select the framing code and the text contained in the framing code.
*
* @param sr
* StyleRange.
*/
private void inFramingCode(StyleRange sr) {
if (highlight) {
textEditorST.setSelection(sr.start, sr.start + sr.length);
}
}
/**
* Check if the key being pressed is a "non-edit" key.
*
@ -901,8 +880,6 @@ public class StyledTextComp extends Composite {
public void handleEvent(Event e) {
if (e.type == SWT.MouseDown) {
handleMouseDown(e);
} else if (e.type == SWT.MouseUp) {
handleMouseUp(e);
}
}
};

View file

@ -4,7 +4,7 @@
Darrel Kingfield NOAA/NSSL/CIMMS 09-02-2014 Initial File Creation
-->
<menuContributionFile>
<include installTo="menu:org.eclipse.ui.main.menu?after=radar"
<include installTo="menu:mrms?after=MRMS_MENU_START"
fileName="menus/mrms/mrms.xml">
</include>
</menuContributionFile>

View file

@ -5,8 +5,6 @@
-->
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Set the initial top level menu -->
<contribute xsi:type="subMenu" menuText="MRMS">
<contribute xsi:type="titleItem" titleText="---Multiple-Radar/Multiple-Sensor---" id="MRMS-SVR"/>
<contribute xsi:type="subinclude" fileName="menus/mrms/mrmsProducts.xml"/>
</contribute>
</menuTemplate>
<contribute xsi:type="titleItem" titleText="---Multiple-Radar/Multiple-Sensor---" id="MRMS-SVR"/>
<!-- <contribute xsi:type="subinclude" fileName="menus/mrms/mrmsProducts.xml"/> -->
</menuTemplate>

View file

@ -53,4 +53,21 @@
name="Grid"
category="com.raytheon.uf.viz.productbrowser.productbrowserpreferencespage"/>
</extension>
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu?after=radar">
<menu
id="mrms"
label="MRMS">
<visibleWhen>
<reference
definitionId="com.raytheon.uf.viz.d2d.ui.inD2DActionSet">
</reference>
</visibleWhen>
<separator name="MRMS_MENU_START" visible="false"/>
</menu>
</menuContribution>
</extension>
</plugin>

View file

@ -11,7 +11,7 @@ package com.raytheon.viz.mpe.ui;
* ------------ ---------- ----------- --------------------------
* Jun 9, 2011 rgeorge Initial creation
* Jun 30, 2014 17457 snaples Updated getCv_use to return name
*
* Jan 7, 2015 16954 cgobs Fix for cv_use issue - using getFieldName() in certain parts.
* </pre>
*
* @author rgeorge
@ -56,7 +56,7 @@ public enum DisplayFieldData {
mlqmosaic("mpe_mlqmosaic_dir", "Q2 MultiSensor Mosaic", 3600, "PRECIP_ACCUM"),
//best estimate QPE
Xmrg("rfcwide_xmrg_dir", "Best Estimate QPE (in)"), //
Xmrg("rfcwide_xmrg_dir", "Best Estimate QPE (in)", 3600, "PRECIP_ACCUM" ), //
p3lMosaic("rfcwide_p3lmosaic_dir",
"P3 Local Bias Corrected Radar-Derived Precip (in)", 3600, "PRECIP_ACCUM"), //
@ -146,11 +146,18 @@ public enum DisplayFieldData {
}
}
public String getFieldName() {
return name().toUpperCase();
}
/**
* @return the cv_use
*/
public String getCv_use() {
cv_use = name().toUpperCase();
if (cv_use == null) {
cv_use = getFieldName();
}
return cv_use;
}

View file

@ -84,8 +84,6 @@ import com.raytheon.viz.mpe.util.DailyQcUtils;
public class DrawDQCStations {
private static DrawDQCStations instance = null;
private DailyQcUtils dqc = DailyQcUtils.getInstance();
private static final List<NamedColorUseSet> pColorSetGroup = MPEColors
.build_mpe_colors();
@ -101,13 +99,13 @@ public class DrawDQCStations {
int points_flag;
boolean qpf_on = MPEDisplayManager.getCurrent().isQpf();
boolean qpf_on = false;
boolean flf_on = false;
boolean maxmin_on = false;
int isom = dqc.isom;
int isom = DailyQcUtils.isom;
int pcpn_time_step = 0;
@ -119,7 +117,7 @@ public class DrawDQCStations {
public static int grids_flag = 0;
int dflag[] = dqc.dflag;
int dflag[] = DailyQcUtils.dflag;
int pcpn_time = 0;
@ -298,25 +296,25 @@ public class DrawDQCStations {
time_pos = 0;
display_flag = 0;
hed = 0;
plot_view = dqc.plot_view;
contour_flag = dqc.contour_flag;
points_flag = dqc.points_flag;
plot_view = DailyQcUtils.plot_view;
contour_flag = DailyQcUtils.contour_flag;
points_flag = DailyQcUtils.points_flag;
qpf_on = MPEDisplayManager.getCurrent().isQpf();
flf_on = MPEDisplayManager.getCurrent().isZflag();
maxmin_on = MPEDisplayManager.getCurrent().isMaxmin();
tbuf = new StringBuilder();
isom = dqc.isom;
isom = DailyQcUtils.isom;
pcpn_time_step = MPEDisplayManager.pcpn_time_step;
map_flag = dqc.map_flag;
pcp_flag = dqc.pcp_flag;
pcpn_day = dqc.pcpn_day;
grids_flag = dqc.grids_flag;
dflag = dqc.dflag;
pcpn_time = dqc.pcpn_time;
// pdata = DailyQcUtils.pdata;
old_isom = dqc.old_isom;
// tdata = DailyQcUtils.tdata;
// zdata = DailyQcUtils.zdata;
map_flag = DailyQcUtils.map_flag;
pcp_flag = DailyQcUtils.pcp_flag;
pcpn_day = DailyQcUtils.pcpn_day;
grids_flag = DailyQcUtils.grids_flag;
dflag = DailyQcUtils.dflag;
pcpn_time = DailyQcUtils.pcpn_time;
// pdata = DailyQcUtils.pdata;
old_isom = DailyQcUtils.old_isom;
// tdata = DailyQcUtils.tdata;
// zdata = DailyQcUtils.zdata;
/*
* get the token dqc_preprocessor_basetime, the default value is 12Z
@ -431,14 +429,17 @@ public class DrawDQCStations {
if (contour_flag == 1) {
Set<DisplayMode> mode = mpd.getDisplayMode();
if (md.getResourceList().containsRsc(pgp)) {
md.getResourceList().removeRsc(pgp);
if (display.getDescriptor().getResourceList()
.containsRsc(pgp)) {
display.getDescriptor().getResourceList()
.removeRsc(pgp);
pgp.dispose();
}
if (mode.contains(DisplayMode.Contour)) {
// we are ok
} else {
mpd.toggleDisplayMode(DisplayMode.Contour);
mode = mpd.getDisplayMode();
if (mode.contains(DisplayMode.Image)) {
mpd.toggleDisplayMode(DisplayMode.Image);
}
@ -717,7 +718,7 @@ public class DrawDQCStations {
Calendar ltime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
StringBuilder mbuf = new StringBuilder();
int dqcEndingObsTime = dqc.getEnding6HourObsTime();
int dqcEndingObsTime = DailyQcUtils.getEnding6HourObsTime();
tbuf = new StringBuilder();
if (qpf_on == true) {
@ -731,10 +732,10 @@ public class DrawDQCStations {
/* Precipitation period is always 12z-12z. */
if ((pcpn_time < 2) && (pcpn_time_step == 0)) {
ltime.setTime(dqc.pdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.pdata[pcpn_day].data_time);
ltime.add(Calendar.SECOND, -86400);
} else {
ltime.setTime(dqc.pdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.pdata[pcpn_day].data_time);
}
tbuf.append("Precipitation ");
@ -784,18 +785,18 @@ public class DrawDQCStations {
tbuf.append(" ending at 12z");
}
if (dqc.pdata[pcpn_day].level == 1) {
if (DailyQcUtils.pdata[pcpn_day].level == 1) {
tbuf.append(" - Level 1");
} else if (dqc.pdata[pcpn_day].level == 2) {
} else if (DailyQcUtils.pdata[pcpn_day].level == 2) {
tbuf.append(" - Level 2");
}
if (dqc.pdata[pcpn_day].used[ptime_pos] == 4) {
if (DailyQcUtils.pdata[pcpn_day].used[ptime_pos] == 4) {
tbuf.append(" Saved");
} else if ((dqc.pdata[pcpn_day].used[ptime_pos] == 3)
|| (dqc.pdata[pcpn_day].used[ptime_pos] == 2)) {
} else if ((DailyQcUtils.pdata[pcpn_day].used[ptime_pos] == 3)
|| (DailyQcUtils.pdata[pcpn_day].used[ptime_pos] == 2)) {
tbuf.append(" Modified");
} else if (dqc.pdata[pcpn_day].used[ptime_pos] == 1) {
} else if (DailyQcUtils.pdata[pcpn_day].used[ptime_pos] == 1) {
tbuf.append(" Not Modified");
} else {
tbuf.append(" - No Data");
@ -810,19 +811,19 @@ public class DrawDQCStations {
if (dqcEndingObsTime == 12) {
/* Times: 18, 00, 06, 12 */
if (pcpn_time < 1) {
ltime.setTime(dqc.zdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.zdata[pcpn_day].data_time);
ltime.add(Calendar.SECOND, -86400);
} else {
ltime.setTime(dqc.zdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.zdata[pcpn_day].data_time);
}
} else {
/* Times 12, 18, 00, 06 */
if (pcpn_time < 2) {
ltime.setTime(dqc.zdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.zdata[pcpn_day].data_time);
ltime.add(Calendar.SECOND, -86400);
} else {
ltime.setTime(dqc.zdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.zdata[pcpn_day].data_time);
}
}
@ -882,20 +883,20 @@ public class DrawDQCStations {
}
if (dqc.zdata[pcpn_day].level[ptime_pos] == 1) {
if (DailyQcUtils.zdata[pcpn_day].level[ptime_pos] == 1) {
tbuf.append(" - Level 1");
} else if (dqc.zdata[pcpn_day].level[ptime_pos] == 2) {
} else if (DailyQcUtils.zdata[pcpn_day].level[ptime_pos] == 2) {
tbuf.append(" - Level 2");
}
if (dqc.zdata[pcpn_day].used[ptime_pos] == 6) {
if (DailyQcUtils.zdata[pcpn_day].used[ptime_pos] == 6) {
tbuf.append(" Calculated");
} else if (dqc.zdata[pcpn_day].used[ptime_pos] == 4) {
} else if (DailyQcUtils.zdata[pcpn_day].used[ptime_pos] == 4) {
tbuf.append(" Saved");
} else if ((dqc.zdata[pcpn_day].used[ptime_pos] == 3)
|| (dqc.zdata[pcpn_day].used[ptime_pos] == 2)) {
} else if ((DailyQcUtils.zdata[pcpn_day].used[ptime_pos] == 3)
|| (DailyQcUtils.zdata[pcpn_day].used[ptime_pos] == 2)) {
tbuf.append(" Modified");
} else if (dqc.zdata[pcpn_day].used[ptime_pos] == 1) {
} else if (DailyQcUtils.zdata[pcpn_day].used[ptime_pos] == 1) {
tbuf.append(" Not Modified");
} else {
tbuf.append(" - No Data");
@ -915,18 +916,18 @@ public class DrawDQCStations {
if (dqcEndingObsTime == 12) {
if ((pcpn_time < 1) && (pcpn_time_step == 0)) {
ltime.setTime(dqc.tdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.tdata[pcpn_day].data_time);
ltime.add(Calendar.SECOND, -86400);
} else {
ltime.setTime(dqc.tdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.tdata[pcpn_day].data_time);
}
} else {
if ((pcpn_time < 2) && (pcpn_time_step == 0)) {
ltime.setTime(dqc.tdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.tdata[pcpn_day].data_time);
ltime.add(Calendar.SECOND, -86400);
} else {
ltime.setTime(dqc.tdata[pcpn_day].data_time);
ltime.setTime(DailyQcUtils.tdata[pcpn_day].data_time);
}
}
@ -994,18 +995,18 @@ public class DrawDQCStations {
tbuf.append(" ending at 12z");
}
if (dqc.tdata[pcpn_day].level[ptime_pos] == 1) {
if (DailyQcUtils.tdata[pcpn_day].level[ptime_pos] == 1) {
tbuf.append(" - Level 1");
} else if (dqc.tdata[pcpn_day].level[ptime_pos] == 2) {
} else if (DailyQcUtils.tdata[pcpn_day].level[ptime_pos] == 2) {
tbuf.append(" - Level 2");
}
if (dqc.tdata[pcpn_day].used[ptime_pos] == 4) {
if (DailyQcUtils.tdata[pcpn_day].used[ptime_pos] == 4) {
tbuf.append(" Saved");
} else if ((dqc.tdata[pcpn_day].used[ptime_pos] == 3)
|| (dqc.tdata[pcpn_day].used[ptime_pos] == 2)) {
} else if ((DailyQcUtils.tdata[pcpn_day].used[ptime_pos] == 3)
|| (DailyQcUtils.tdata[pcpn_day].used[ptime_pos] == 2)) {
tbuf.append(" Modified");
} else if (dqc.tdata[pcpn_day].used[ptime_pos] == 1) {
} else if (DailyQcUtils.tdata[pcpn_day].used[ptime_pos] == 1) {
tbuf.append(" Not Modified");
} else {
tbuf.append(" - No Data");

View file

@ -36,7 +36,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* ------------ ---------- ----------- --------------------------
* Jun 17, 2009 snaples Initial creation
* May 06, 2011 #8994 jpiatt Added set precipitation value as zero
*
* Sep 04, 2014 283 cgobs Fixed possible selection of filtered-out gages
* </pre>
*
* @author snaples
@ -45,15 +45,13 @@ import com.vividsolutions.jts.geom.Coordinate;
public class GroupEditPrecipStns {
private DailyQcUtils dqc = DailyQcUtils.getInstance();
public void group_edit_precip_stations(ReferencedCoordinate rcoord) {
int time_pos;
int i, m, k;
float lat, lon;
double testdist, maxdist;
int isave;
int max_stations = dqc.precip_stations.size();
int max_stations = DailyQcUtils.precip_stations.size();
Coordinate coord = new Coordinate();
try {
@ -64,7 +62,7 @@ public class GroupEditPrecipStns {
}
if (MPEDisplayManager.pcpn_time_step == 0) {
time_pos = dqc.pcpn_time;
time_pos = DailyQcUtils.pcpn_time;
} else {
time_pos = 4;
@ -78,47 +76,61 @@ public class GroupEditPrecipStns {
* mouse click point.
*/
for (i = 0; i < max_stations; i++) {
if (dqc.pdata[dqc.pcpn_day].stn[i].frain[time_pos].data < 0) {
if (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[i].frain[time_pos].data < 0) {
continue;
}
if (dqc.pdata[dqc.pcpn_day].stn[i].frain[time_pos].data < QcPrecipOptionsDialog
//precip filter
if (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[i].frain[time_pos].data < QcPrecipOptionsDialog
.getPointFilterValue()) {
continue;
}
//reverse precip filter
if (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[i].frain[time_pos].data > QcPrecipOptionsDialog
.getPointFilterReverseValue()) {
continue;
}
//elevation filter
if (DailyQcUtils.precip_stations.get(i).elev < DailyQcUtils.elevation_filter_value)
{
continue;
}
/* Retrieve the latitude and longitude of this station. */
lat = dqc.precip_stations.get(i).lat;
lon = dqc.precip_stations.get(i).lon;
lat = DailyQcUtils.precip_stations.get(i).lat;
lon = DailyQcUtils.precip_stations.get(i).lon;
if (dqc.precip_stations.get(i).tip == 0
&& dqc.gage_char[0] == -1) {
if (DailyQcUtils.precip_stations.get(i).tip == 0
&& DailyQcUtils.gage_char[0] == -1) {
continue;
}
if (dqc.precip_stations.get(i).tip == 1
&& dqc.gage_char[1] == -1) {
if (DailyQcUtils.precip_stations.get(i).tip == 1
&& DailyQcUtils.gage_char[1] == -1) {
continue;
}
for (m = 0; m < dqc.tsmax; m++) {
for (m = 0; m < DailyQcUtils.tsmax; m++) {
if ((dqc.precip_stations.get(i).parm.substring(3, 5)
.equalsIgnoreCase(dqc.ts[m].abr))
&& dqc.dflag[m + 1] == 1) {
if ((DailyQcUtils.precip_stations.get(i).parm.substring(3, 5)
.equalsIgnoreCase(DailyQcUtils.ts[m].abr))
&& DailyQcUtils.dflag[m + 1] == 1) {
break;
}
}
if (m == dqc.tsmax) {
if (m == DailyQcUtils.tsmax) {
continue;
}
for (m = 0; m < 9; m++) {
if (m == dqc.pdata[dqc.pcpn_day].stn[i].frain[time_pos].qual
&& dqc.qflag[m] == 1) {
if (m == DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[i].frain[time_pos].qual
&& DailyQcUtils.qflag[m] == 1) {
break;
}
@ -143,19 +155,19 @@ public class GroupEditPrecipStns {
return;
}
if (dqc.pdata[dqc.pcpn_day].stn[isave].frain[time_pos].qual != GroupEditStationsDialog.group_qual) {
if (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[time_pos].qual != GroupEditStationsDialog.group_qual) {
QcPrecipOptionsDialog.renderGridsBtn.setEnabled(true);
}
dqc.pdata[dqc.pcpn_day].stn[isave].frain[time_pos].qual = (short) GroupEditStationsDialog.group_qual;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[time_pos].qual = (short) GroupEditStationsDialog.group_qual;
if (GroupEditStationsDialog.group_qual == 1
&& time_pos == 4
&& dqc.pdata[dqc.pcpn_day].stn[isave].sflag[time_pos] == 1) {
&& DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].sflag[time_pos] == 1) {
dqc.pdata[dqc.pcpn_day].stn[isave].frain[time_pos].data = dqc.pdata[dqc.pcpn_day].stn[isave].rrain[time_pos].data;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[time_pos].data = DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].rrain[time_pos].data;
dqc.pdata[dqc.pcpn_day].stn[isave].sflag[time_pos] = -1;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].sflag[time_pos] = -1;
}
@ -164,7 +176,7 @@ public class GroupEditPrecipStns {
|| GroupEditStationsDialog.group_qual == 0 || GroupEditStationsDialog.group_qual == 8)) {
for (k = 0; k < 4; k++) {
dqc.pdata[dqc.pcpn_day].stn[isave].frain[k].qual = (short) GroupEditStationsDialog.group_qual;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[k].qual = (short) GroupEditStationsDialog.group_qual;
}
}
@ -176,12 +188,12 @@ public class GroupEditPrecipStns {
* and QC codes to "Manual"
*/
if (GroupEditStationsDialog.group_qual == 2) {
dqc.pdata[dqc.pcpn_day].stn[isave].frain[time_pos].data = 0.0f;
dqc.pdata[dqc.pcpn_day].stn[isave].frain[time_pos].qual = 2;
if ((dqc.pdata[dqc.pcpn_day].stn[isave].frain[4].data - 0.0) < 0.0001) {
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[time_pos].data = 0.0f;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[time_pos].qual = 2;
if ((DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[4].data - 0.0) < 0.0001) {
for (k = 0; k < 4; k++) {
dqc.pdata[dqc.pcpn_day].stn[isave].frain[k].data = 0.0f;
dqc.pdata[dqc.pcpn_day].stn[isave].frain[k].qual = 2;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[k].data = 0.0f;
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[k].qual = 2;
}
}
}
@ -190,23 +202,23 @@ public class GroupEditPrecipStns {
if (time_pos != 4
&& GroupEditStationsDialog.group_qual == 1
&& dqc.pdata[dqc.pcpn_day].stn[isave].frain[4].qual != 5
&& dqc.pdata[dqc.pcpn_day].stn[isave].frain[4].qual != 4) {
dqc.pdata[dqc.pcpn_day].stn[isave].frain[4].qual = (short) GroupEditStationsDialog.group_qual;
&& DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[4].qual != 5
&& DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[4].qual != 4) {
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[isave].frain[4].qual = (short) GroupEditStationsDialog.group_qual;
}
for (k = 0; k < 5; k++) {
if (k < 4) {
time_pos = dqc.pcpn_day * 4 + k;
time_pos = DailyQcUtils.pcpn_day * 4 + k;
} else {
time_pos = 40 + dqc.pcpn_day;
time_pos = 40 + DailyQcUtils.pcpn_day;
}
dqc.pcp_in_use[time_pos] = -1;
DailyQcUtils.pcp_in_use[time_pos] = -1;
if (dqc.pdata[dqc.pcpn_day].used[k] != 0) {
dqc.pdata[dqc.pcpn_day].used[k] = 2;
if (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].used[k] != 0) {
DailyQcUtils.pdata[DailyQcUtils.pcpn_day].used[k] = 2;
}
}
return;

View file

@ -45,7 +45,6 @@ import com.raytheon.viz.mpe.util.MakeRsel;
import com.raytheon.viz.mpe.util.QCStations;
import com.raytheon.viz.mpe.util.QCTStations;
import com.raytheon.viz.mpe.util.ReadFreezingStationList;
import com.raytheon.viz.mpe.util.ReadPrecipStationList;
import com.raytheon.viz.mpe.util.ReadTemperatureStationList;
import com.raytheon.viz.mpe.util.RenderPcp;
import com.raytheon.viz.mpe.util.RenderT;
@ -442,8 +441,8 @@ public class OtherPrecipOptions {
MakeRsel mr = new MakeRsel();
// Hrap_Grid hrap_grid = DailyQcUtils.getHrap_grid();
Calendar tmtime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ReadPrecipStationList rp = new ReadPrecipStationList();
int num_stations = rp.getNumPstations();
// ReadPrecipStationList rp = new ReadPrecipStationList();
int num_stations = dqc.precip_stations.size();
String s = appsDefaults.getToken(dqc_ending_6hour_obstime_tok);
int dqc_ending_6hour_obstime = ((!(null == s)) ? Integer.parseInt(s)
: -1);

View file

@ -16,6 +16,14 @@
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 7, 2015 16954 cgobs Fix for cv_use issue - using getFieldName() in certain parts.
* </pre>
**/
package com.raytheon.viz.mpe.ui.actions;
@ -116,7 +124,7 @@ public class SaveBestEstimate {
String rfc = MPEDataManager.getInstance().getRFC();
update_rwr_save(rfc, editDate, bestEstField.getCv_use());
update_rwr_save(rfc, editDate, bestEstField.getFieldName());
XmrgFile xmrgFile = MPEDisplayManager.getXmrgFile(bestEstField,
editDate);

View file

@ -1032,7 +1032,7 @@ public class SaveLevel2Data {
/* build map file */
System.out.println("Building MAP .");
found: for (m = 0; mean_areal_precip_global[m].hb5 != ""; m++) {
found: for (m = 0; mean_areal_precip_global[m] != null; m++) {
for (k = 0; k < 4; k++) {
num = j * 4 + 3 - k;
@ -1047,9 +1047,11 @@ public class SaveLevel2Data {
}
if (mean_areal_precip_global[m].hb5 == "") {
if (mean_areal_precip_global[m] != null) {
if (mean_areal_precip_global[m].hb5 == "") {
System.out.println("MAP.hb5 is empty, continuing. ");
continue;
}
}
gm.setTime(dqc.pdata[j].data_time);

View file

@ -167,7 +167,6 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
cal.setTime(prevDate);
if( prevHydDate == null ){
// prevHydDate = prevDate;
prevHydDate = displayMgr.getCurrentEditDate();
hydroCal.setTime(prevHydDate);

View file

@ -387,6 +387,7 @@ public class EditPrecipStationsDialog extends AbstractMPEDialog implements
if (srain.data > -98) {
if (time_pos == HOURS_24 && srain.data >= 0) {
snow = true;
System.out.println("Snow data is true for station.");
}
}
@ -476,6 +477,7 @@ public class EditPrecipStationsDialog extends AbstractMPEDialog implements
"Snow water change is %5.2f in.", srain.data));
if (time_pos == HOURS_24 && srain.data >= 0) {
snow = true;
System.out.println("Snow water change is available for " + selectedStation.hb5);
}
}

View file

@ -210,8 +210,8 @@ public class QcPrecipOptionsDialog extends AbstractMPEDialog {
Shell parent = this.getParent();
Display display = parent.getDisplay();
MPEDisplayManager displayMgr = MPEDisplayManager.getCurrent();
Date prevDate = displayMgr.getCurrentEditDate();
Date currDate = ChooseDataPeriodDialog.prevDate;
Date prevDate = ChooseDataPeriodDialog.getCurrentHydroEditDate();
Date currDate = ChooseDataPeriodDialog.prevHydDate;
String QcArea = ChooseDataPeriodDialog.prevArea;
AppsDefaults appDefaults = AppsDefaults.getInstance();
DisplayFieldData df = displayMgr.getDisplayFieldType();

View file

@ -56,7 +56,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Polygon values will now be
* displayed for polygons with
* the "sub" action.
*
* Jan 7, 2015 16954 cgobs Fix for cv_use issue - using getFieldName() in certain parts.
* </pre>
*
* @author mpduff
@ -286,8 +286,8 @@ public class DeletePolygonDlg extends CaveSWTDialog {
polygonListBox.removeAll();
String type = displayManager.getDisplayFieldType().getCv_use()
.toUpperCase();
String type = displayManager.getDisplayFieldType().getFieldName();
productTF.setText(type);
polygonList = PolygonEditManager.getPolygonEdits(fieldData, editDate);
recreatePolygonListBox();
@ -314,7 +314,7 @@ public class DeletePolygonDlg extends CaveSWTDialog {
PolygonEditAction action = data.getEditAction();
if (action == PolygonEditAction.SUB) {
String value = data.getSubDrawSource().getCv_use();
String value = data.getSubDrawSource().getFieldName();
polygonListBox.add(String.format(format2, number, displayed,
persist, action.toPrettyName(), value));
} else {

View file

@ -33,6 +33,7 @@ import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
@ -63,6 +64,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Jan 29, 2014 16561 snaples Updated processDrawPrecipValue to remove polygon wireframe after setting value.
* Feb 2, 2014 16201 snaples Added saved data flag support
* Apr 28, 2014 16707 snaples Added code to save and set location of dialog box when moved.
* Jan 12, 2015 16993 snaples Restored code for Substitute Field Combo box.
*
*
* </pre>
@ -78,6 +80,9 @@ public class DrawPolygonDlg extends CaveSWTDialog {
private static final String MAKE_PERSISTENT = "Make Persistent";
private DisplayFieldData[] displayFieldDataArray;
private String[] displayTypeNameArray;
/**
* Bold Font.
*/
@ -88,6 +93,11 @@ public class DrawPolygonDlg extends CaveSWTDialog {
*/
private Font font = null;
/**
* The field type selection Combo control.
*/
private Combo fieldTypeCombo = null;
/**
* The precip value spinner control.
*/
@ -227,7 +237,7 @@ public class DrawPolygonDlg extends CaveSWTDialog {
GridData gd = new GridData(345, SWT.DEFAULT);
subGroup.setLayoutData(gd);
getSubChecks(subGroup);
createFieldCombo(subGroup);
// Create Substitute button
final Button subBtn = new Button(subGroup, SWT.PUSH);
@ -349,398 +359,80 @@ public class DrawPolygonDlg extends CaveSWTDialog {
* @param groupComp
* The group composite
*/
private void getSubChecks(Group groupComp) {
private void createFieldCombo(Group groupComp) {
// Spacer
Label spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
// Create a container to hold the label and the combo box.
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
Composite prodListComp = new Composite(shell, SWT.NONE);
GridLayout prodListCompLayout = new GridLayout(2, false);
prodListComp.setLayout(prodListCompLayout);
prodListComp.setLayoutData(gd);
Button radarMosaicChk = new Button(groupComp, SWT.RADIO);
GridData gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
radarMosaicChk.setLayoutData(gd);
radarMosaicChk.setText("Radar Mosaic");
radarMosaicChk.setFont(font);
radarMosaicChk.setLayoutData(gd);
// Default to radar mosaic on dialog creation
radarMosaicChk.setSelection(true);
subType = DisplayFieldData.rMosaic;
radarMosaicChk.addSelectionListener(new SelectionAdapter() {
gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
Label fieldTypeLabel = new Label(prodListComp, SWT.CENTER);
fieldTypeLabel.setText(SUBSTITUTE_VALUE_TEXT);
fieldTypeLabel.setLayoutData(gd);
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
fieldTypeCombo = new Combo(groupComp, SWT.LEFT | SWT.DROP_DOWN
| SWT.READ_ONLY);
if (displayFieldDataArray == null)
{
displayFieldDataArray = MPEDisplayManager.mpe_qpe_fields;
}
// Label spaceLabel = new Label(groupComp, SWT.NONE);
// spaceLabel.setText("***** ");
int selectedFieldIndex = 0;
//find the index of the selected field
for (selectedFieldIndex = 0; selectedFieldIndex < displayFieldDataArray.length; selectedFieldIndex++)
{
if (displayFieldDataArray[selectedFieldIndex] == subType)
{
break;
}
}
//create and initialize the display field type name array
displayTypeNameArray = new String[displayFieldDataArray.length];
for (int i = 0; i < displayFieldDataArray.length; i++) {
String fieldName = displayFieldDataArray[i].toString();
// System.out.println("DrawPolygon.createFieldCombo(): FieldName = :" + fieldName + ":");
displayTypeNameArray[i] = fieldName;
}
//select the field
fieldTypeCombo.setTextLimit(35);
fieldTypeCombo.setLayoutData(gd);
fieldTypeCombo.setItems(displayTypeNameArray);
fieldTypeCombo.select(selectedFieldIndex);
fieldTypeCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.rMosaic;
}
String selectedFieldString = fieldTypeCombo.getText();
// System.out.println("DrawPolygon.createFieldCombo(): selectedFieldString = " +
// selectedFieldString);
subType = DisplayFieldData.fromDisplayNameString(selectedFieldString);
// if (subType != null)
// {
// System.out.println("DrawPolygon.createFieldCombo(): subType = " +
// subType.toString());
// }
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button avgRadarMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
avgRadarMosaicChk.setLayoutData(gd);
avgRadarMosaicChk.setText("Average Radar Mosaic");
avgRadarMosaicChk.setFont(font);
avgRadarMosaicChk.setLayoutData(gd);
avgRadarMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.avgrMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button maxRadarMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
maxRadarMosaicChk.setLayoutData(gd);
maxRadarMosaicChk.setText("Max Radar Mosaic");
maxRadarMosaicChk.setFont(font);
maxRadarMosaicChk.setLayoutData(gd);
maxRadarMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.maxrMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button fieldBiasRadarMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
fieldBiasRadarMosaicChk.setLayoutData(gd);
fieldBiasRadarMosaicChk.setText("Field Bias Radar Mosaic");
fieldBiasRadarMosaicChk.setFont(font);
fieldBiasRadarMosaicChk.setLayoutData(gd);
fieldBiasRadarMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.bMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button localBiasRadarMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
localBiasRadarMosaicChk.setLayoutData(gd);
localBiasRadarMosaicChk.setText("Local Bias Radar Mosaic");
localBiasRadarMosaicChk.setFont(font);
localBiasRadarMosaicChk.setLayoutData(gd);
localBiasRadarMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.lMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button gageOnlyChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
gageOnlyChk.setLayoutData(gd);
gageOnlyChk.setText("Gage Only Analysis");
gageOnlyChk.setFont(font);
gageOnlyChk.setLayoutData(gd);
gageOnlyChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.gageOnly;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button multiSensorMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
multiSensorMosaicChk.setLayoutData(gd);
multiSensorMosaicChk.setText("Multisensor Mosaic");
multiSensorMosaicChk.setFont(font);
multiSensorMosaicChk.setLayoutData(gd);
multiSensorMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.mMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button localBiasMultiSensorMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
localBiasMultiSensorMosaicChk.setLayoutData(gd);
localBiasMultiSensorMosaicChk.setText("Local Bias Multisensor Mosaic");
localBiasMultiSensorMosaicChk.setFont(font);
localBiasMultiSensorMosaicChk.setLayoutData(gd);
localBiasMultiSensorMosaicChk
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.mlMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button satPrecipChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
satPrecipChk.setLayoutData(gd);
satPrecipChk.setText("Satellite Precip");
satPrecipChk.setFont(font);
satPrecipChk.setLayoutData(gd);
satPrecipChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.satPre;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button localBiasSatPrecipChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
localBiasSatPrecipChk.setLayoutData(gd);
localBiasSatPrecipChk.setText("Local Bias Satellite Precip");
localBiasSatPrecipChk.setFont(font);
localBiasSatPrecipChk.setLayoutData(gd);
localBiasSatPrecipChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.lsatPre;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button satRadarMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
satRadarMosaicChk.setLayoutData(gd);
satRadarMosaicChk.setText("Satellite Radar Mosaic");
satRadarMosaicChk.setFont(font);
satRadarMosaicChk.setLayoutData(gd);
satRadarMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.srMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button satGageMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
satGageMosaicChk.setLayoutData(gd);
satGageMosaicChk.setText("Satellite Gage Mosaic");
satGageMosaicChk.setFont(font);
satGageMosaicChk.setLayoutData(gd);
satGageMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.sgMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button satRadarGageMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
satRadarGageMosaicChk.setLayoutData(gd);
satRadarGageMosaicChk.setText("Satellite Radar Gage Mosaic");
satRadarGageMosaicChk.setFont(font);
satRadarGageMosaicChk.setLayoutData(gd);
satRadarGageMosaicChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.srgMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button triangulatedLocalBiasMosaicChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
triangulatedLocalBiasMosaicChk.setLayoutData(gd);
triangulatedLocalBiasMosaicChk
.setText("Triangulated Local Bias Mosaic");
triangulatedLocalBiasMosaicChk.setFont(font);
triangulatedLocalBiasMosaicChk.setLayoutData(gd);
triangulatedLocalBiasMosaicChk
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.p3lMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button bestEstQPEChk = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
bestEstQPEChk.setLayoutData(gd);
bestEstQPEChk.setText("Best Estimate QPE");
bestEstQPEChk.setFont(font);
bestEstQPEChk.setLayoutData(gd);
bestEstQPEChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.Xmrg;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button rfcFieldBiasMosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
rfcFieldBiasMosaic.setLayoutData(gd);
rfcFieldBiasMosaic.setText("RFC Field Bias Mosaic");
rfcFieldBiasMosaic.setFont(font);
rfcFieldBiasMosaic.setLayoutData(gd);
rfcFieldBiasMosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.rfcbMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button rfcMultiSensorMosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
rfcMultiSensorMosaic.setLayoutData(gd);
rfcMultiSensorMosaic.setText("RFC Multisensor Mosaic");
rfcMultiSensorMosaic.setFont(font);
rfcMultiSensorMosaic.setLayoutData(gd);
rfcMultiSensorMosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.rfcmMosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button rawQ2Mosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
rawQ2Mosaic.setLayoutData(gd);
rawQ2Mosaic.setText("Raw Q2 Mosaic");
rawQ2Mosaic.setFont(font);
rawQ2Mosaic.setLayoutData(gd);
rawQ2Mosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.qmosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button localBQ2Mosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
localBQ2Mosaic.setLayoutData(gd);
localBQ2Mosaic.setText("Local Bias Q2 Mosaic");
localBQ2Mosaic.setFont(font);
localBQ2Mosaic.setLayoutData(gd);
localBQ2Mosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.lqmosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button mQ2Mosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
mQ2Mosaic.setLayoutData(gd);
mQ2Mosaic.setText("Multisensor Q2 Mosaic");
mQ2Mosaic.setFont(font);
mQ2Mosaic.setLayoutData(gd);
mQ2Mosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.mlqmosaic;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button local1Mosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
local1Mosaic.setLayoutData(gd);
local1Mosaic.setText("Local Field #1");
local1Mosaic.setFont(font);
local1Mosaic.setLayoutData(gd);
local1Mosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.localField1;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button local2Mosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
local2Mosaic.setLayoutData(gd);
local2Mosaic.setText("Local Field #2");
local2Mosaic.setFont(font);
local2Mosaic.setLayoutData(gd);
local2Mosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.localField2;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button local3Mosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
local3Mosaic.setLayoutData(gd);
local3Mosaic.setText("Local Field #3");
local3Mosaic.setFont(font);
local3Mosaic.setLayoutData(gd);
local3Mosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.localField3;
}
});
spaceLabel = new Label(groupComp, SWT.NONE);
spaceLabel.setText(" ");
Button rfcQpeMosaic = new Button(groupComp, SWT.RADIO);
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
rfcQpeMosaic.setLayoutData(gd);
rfcQpeMosaic.setText("RFC QPE Mosaic");
rfcQpeMosaic.setFont(font);
rfcQpeMosaic.setLayoutData(gd);
rfcQpeMosaic.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
subType = DisplayFieldData.rfcMosaic;
}
});
}
/**
* Process the selection.

View file

@ -16,6 +16,14 @@
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 7, 2015 16954 cgobs Fix for cv_use issue - using getFieldName() in certain parts.
* </pre>
**/
package com.raytheon.viz.mpe.ui.dialogs.polygon;
@ -233,7 +241,7 @@ public class PolygonEditManager {
String polyEditStr = editAction.toPrettyName()
+ " "
+ (subDrawSource != null ? subDrawSource.getCv_use()
+ (subDrawSource != null ? subDrawSource.getFieldName()
: String.format("%6.2f", precipValue)) + " "
+ editPoints.length + " " + (visible ? "1" : "0");
toUse.append(idx + " " + polyEditStr + "\n");
@ -288,7 +296,7 @@ public class PolygonEditManager {
}
private static File getHourlyEditFile(DisplayFieldData fieldData, Date date) {
String fieldname = fieldData.getCv_use();
String fieldname = fieldData.getFieldName();
String polygonDir = MPEDisplayManager.getPolygonEditDir();
/* Build the polygon filename. */
@ -299,7 +307,7 @@ public class PolygonEditManager {
private static File getPersistentEditFile(DisplayFieldData fieldData,
Date date) {
String fieldname = fieldData.getCv_use();
String fieldname = fieldData.getFieldName();
String polygonDir = MPEDisplayManager.getPolygonEditDir();
/* Build the persistent polygon filename. */
String persistentFilename = String.format("%s/DrawPoly%s", polygonDir,
@ -345,7 +353,7 @@ public class PolygonEditManager {
DisplayFieldData subData = null;
for (DisplayFieldData fieldData : DisplayFieldData
.values()) {
if (fieldData.getCv_use()
if (fieldData.getFieldName()
.equalsIgnoreCase(subCvUse)) {
subData = fieldData;
break;

View file

@ -58,8 +58,6 @@ public class PostAnalysisManager
private XmrgFile.XmrgHeader xmrgHeader = null;
private boolean misbin[][] = getMisBin();
private DailyQcUtils dqc = DailyQcUtils.getInstance();
private static final double MISSING_VALUE = -9999.0;
private static final double MM_PER_INCH = 25.4;
@ -88,14 +86,14 @@ public class PostAnalysisManager
}
public Date getSelectedDate()
public static Date getSelectedDate()
{
Date date = dqc.pdata[dqc.pcpn_day].data_time;
Date date = DailyQcUtils.pdata[DailyQcUtils.pcpn_day].data_time;
return date;
}
public String getSelectedDateString()
public static String getSelectedDateString()
{
String header = "postAnalysisManager.getSelectedDateString(): ";
@ -116,7 +114,7 @@ public class PostAnalysisManager
}
public String get24HourGageOnlyFilePath()
public static String get24HourGageOnlyFilePath()
{
String filePath = null;
final String mpe_grid_precip_dir_tok = "mpe_grid_precip_dir";
@ -124,9 +122,9 @@ public class PostAnalysisManager
String mpe_grid_precip_dir = ad.getToken(mpe_grid_precip_dir_tok);
String currentQcArea = dqc.currentQcArea;
String currentQcArea = DailyQcUtils.currentQcArea;
String dateString = getSelectedDateString();
String dateString = PostAnalysisManager.getSelectedDateString();
// String dateString = "20140112";
@ -232,7 +230,7 @@ public class PostAnalysisManager
String[] fileNameArray = fileDirectory.list();
int precipDay = dqc.pcpn_day;
int precipDay = DailyQcUtils.pcpn_day;
List<String> filteredFileNameList = filterFileNames(precipDay, fileNameArray);
@ -270,9 +268,9 @@ public class PostAnalysisManager
return endTime;
}
public double[][] get24HourTotalPrecip(int height, int width, double scaleFactor)
public static double[][] get24HourTotalPrecip(int height, int width, double scaleFactor)
{
Date endDate = getSelectedDate();
Date endDate = PostAnalysisManager.getSelectedDate();
// System.out.println("PostAnalysisManager.getEndTime() = " + endDate);
double missingValue = -999.0;
@ -352,8 +350,8 @@ public class PostAnalysisManager
double distanceSquared;
double nearestDistanceSquared = 9999999.0;
int XOR = dqc.getHrap_grid().hrap_minx;
int YOR = dqc.getHrap_grid().hrap_miny;
int XOR = DailyQcUtils.getHrap_grid().hrap_minx;
int YOR = DailyQcUtils.getHrap_grid().hrap_miny;
// Find the distance to the nearest precip station from this HRAP
// bin at [i][j]
@ -389,7 +387,7 @@ public class PostAnalysisManager
{
String header = "PostAnalysisManager.create3DGridArray(): ";
Hrap_Grid hrap_grid = dqc.getHrap_grid();
Hrap_Grid hrap_grid = DailyQcUtils.getHrap_grid();
int maxI = hrap_grid.maxi;
int maxJ = hrap_grid.maxj;
@ -408,7 +406,7 @@ public class PostAnalysisManager
{
//String header = "PostAnalysisManager.create2DGridArray(): ";
Hrap_Grid hrap_grid = dqc.getHrap_grid();
Hrap_Grid hrap_grid = DailyQcUtils.getHrap_grid();
int maxCols = hrap_grid.maxi;
int maxRows = hrap_grid.maxj;
@ -992,7 +990,7 @@ public class PostAnalysisManager
}
*/
Hrap_Grid grid = dqc.getHrap_grid();
Hrap_Grid grid = DailyQcUtils.getHrap_grid();
int maxJ = grid.maxj;
int maxI = grid.maxi;
@ -1249,8 +1247,8 @@ public class PostAnalysisManager
{
String header = "PostAnalysisManager.mergeData(): ";
int MAXX = dqc.getHrap_grid().maxi;
int MAXY = dqc.getHrap_grid().maxj;
int MAXX = DailyQcUtils.getHrap_grid().maxi;
int MAXY = DailyQcUtils.getHrap_grid().maxj;
double logRHat;
int i, j;
@ -1258,10 +1256,10 @@ public class PostAnalysisManager
double weightingFactor;
int precipStationCount;
// List<Station> precipStationList = dqc.precip_stations;
List<Station> precipStationList = DailyQcUtils.precip_stations;
precipStationCount = dqc.precip_stations.size();
precipStationCount = precipStationList.size();
logRHat = Math.log((double) rhat);
@ -1316,7 +1314,7 @@ public class PostAnalysisManager
//System.out.println(header + "merge section");
weightingFactor = computeObservedWeight (i, j, logRHat,
dqc.precip_stations, precipStationCount, estimatedScale);
precipStationList, precipStationCount, estimatedScale);
double mergedValueInInches = weightingFactor * gageOnlyGridValueInInches +
(1.0 - weightingFactor) * qpeInches;

View file

@ -63,7 +63,6 @@ public class SummedHourlyMpeDlg extends BasePostAnalysisDlg
private static final int SECONDS_PER_HOUR = 3600;
private static final int SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
private DailyQcUtils dqc = DailyQcUtils.getInstance();
/** Bundle file location */
//private static final String BUNDLE_LOC = "bundles/MPE/postAnalysisBundle.xml";
@ -80,11 +79,10 @@ public class SummedHourlyMpeDlg extends BasePostAnalysisDlg
setResourceType1(PAResourceType.XMRG);
setResourceType2(PAResourceType.ASCII_XMRG);
PostAnalysisManager paMgr = new PostAnalysisManager();
// 24 accumulated 1-hour precip grids
Hrap_Grid grid = dqc.getHrap_grid();
Hrap_Grid grid = DailyQcUtils.getHrap_grid();
int wfoMinX = grid.hrap_minx;
int wfoMinY = grid.hrap_miny;
int width = grid.maxi;
@ -97,7 +95,7 @@ public class SummedHourlyMpeDlg extends BasePostAnalysisDlg
float scaleFactor = 25.4f * 100.0f;
double[][] totalPrecipGrid = paMgr.get24HourTotalPrecip(height, width, scaleFactor);
double[][] totalPrecipGrid = PostAnalysisManager.get24HourTotalPrecip(height, width, scaleFactor);
//floatArray units are hundredths of MM
@ -106,7 +104,7 @@ public class SummedHourlyMpeDlg extends BasePostAnalysisDlg
setDataArray1(floatArray);
//24 hour gage only
String dataFilePath2 = paMgr.get24HourGageOnlyFilePath();
String dataFilePath2 = PostAnalysisManager.get24HourGageOnlyFilePath();
setDataFileName2(dataFilePath2);
return;
@ -116,12 +114,12 @@ public class SummedHourlyMpeDlg extends BasePostAnalysisDlg
private float[] convertToFloatArray(double[][] totalPrecipGrid, float unitConversionFactor)
{
String header = "SummedHourlyMpeDlg.convertToFloatArray(qpeAccum24hr): ";
Hrap_Grid hrap_grid = dqc.getHrap_grid();
Hrap_Grid hrap_grid = DailyQcUtils.getHrap_grid();
int maxCols = hrap_grid.maxi;
int maxRows = hrap_grid.maxj;
int precipDay = dqc.pcpn_day;
int precipDay = DailyQcUtils.pcpn_day;
System.out.println(header + "DailyQcUtils.pcpn_day = " + dqc.pcpn_day);
System.out.println(header + "DailyQcUtils.pcpn_day = " + DailyQcUtils.pcpn_day);
System.out.println(header + "precipDay = " + precipDay);
float[] valueArray = new float[maxRows*maxCols];

View file

@ -16,6 +16,14 @@
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 7, 2015 16954 cgobs Fix for cv_use issue - using getFieldName() in certain parts.
* </pre>
**/
package com.raytheon.viz.mpe.ui.rsc;
@ -580,7 +588,7 @@ public class DisplayMeanArealPrecipResource extends
// this will accumulate all hours requested and display it
// this holds current xmrg values
short[] tempdata = null;
String cv_use = displayMgr.getDisplayFieldType().getCv_use();
String cv_use = displayMgr.getDisplayFieldType().getFieldName();
String dirname = appsDefaults.getToken(displayMgr.getDisplayFieldType()
.getDirToken());
String fname = "";

View file

@ -73,6 +73,8 @@ import com.raytheon.viz.mpe.ui.actions.DrawDQCStations;
import com.raytheon.viz.mpe.ui.actions.OtherPrecipOptions;
import com.raytheon.viz.mpe.util.CreateMap;
import com.raytheon.viz.mpe.util.DailyQcUtils;
import com.raytheon.viz.mpe.util.DailyQcUtils.Hrap_Grid;
import com.raytheon.viz.mpe.util.DailyQcUtils.Pcp;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
@ -97,10 +99,6 @@ public class PlotGriddedPrecipResource extends
IMpeResource {
MPEDisplayManager displayMgr = null;
private DailyQcUtils dqc = DailyQcUtils.getInstance();
private DrawDQCStations ddq = DrawDQCStations.getInstance();
private GriddedImageDisplay2 gridDisplay;
@ -124,11 +122,11 @@ public class PlotGriddedPrecipResource extends
int display_flag;
// Hrap_Grid hrap_grid = DailyQcUtils.getHrap_grid();
Hrap_Grid hrap_grid = DailyQcUtils.getHrap_grid();
// Pcp pcp = DailyQcUtils.pcp;
Pcp pcp = DailyQcUtils.pcp;
// Pcp spf = DailyQcUtils.spf;
Pcp spf = DailyQcUtils.spf;
private ColorMapParameters parameters = new ColorMapParameters();
@ -143,7 +141,7 @@ public class PlotGriddedPrecipResource extends
this.colorSet = colorSet;
}
ColorMap precip_colormap = ddq.colorMap;
ColorMap precip_colormap = DrawDQCStations.colorMap;
RGB color = null;
@ -154,8 +152,8 @@ public class PlotGriddedPrecipResource extends
public void plot_gridded_precip(String prefix, int num, int mnum) {
int pcpn_time_step = MPEDisplayManager.pcpn_time_step;
int rsmode = OtherPrecipOptions.rsmode;
boolean wfo_all = dqc.wfo_all;
int[] wfo_in_use = dqc.wfo_in_use;
boolean wfo_all = DailyQcUtils.wfo_all;
int[] wfo_in_use = DailyQcUtils.wfo_in_use;
CreateMap cm = new CreateMap();
float value = 0;
@ -225,37 +223,37 @@ public class PlotGriddedPrecipResource extends
if (num == 0) {
i1 = 0;
}
if (dqc.pcp_in_use[num + mnum] != -1
&& dqc.pcp_in_use[num + mnum - i1] != -1) {
cm.read_file(file, num + mnum, dqc.spf);
cm.read_file(file, num + mnum - i1, dqc.pcp);
if (DailyQcUtils.pcp_in_use[num + mnum] != -1
&& DailyQcUtils.pcp_in_use[num + mnum - i1] != -1) {
cm.read_file(file, num + mnum, spf);
cm.read_file(file, num + mnum - i1, pcp);
for (i = 0; i < (dqc.getHrap_grid().maxi - dqc.getHrap_grid().hrap_minx) - 1; i++) {
for (j = 0; j < dqc.getHrap_grid().maxj - dqc.getHrap_grid().hrap_miny - 1; j++) {
dqc.spf.value[i][j] = (dqc.spf.value[i][j] + dqc.pcp.value[i][j]) / 2;
for (i = 0; i < (hrap_grid.maxi - hrap_grid.hrap_minx) - 1; i++) {
for (j = 0; j < hrap_grid.maxj - hrap_grid.hrap_miny - 1; j++) {
spf.value[i][j] = (spf.value[i][j] + pcp.value[i][j]) / 2;
}
}
} else if (dqc.pcp_in_use[num + mnum] == 1) {
cm.read_file(file, num + mnum, dqc.spf);
} else if (dqc.pcp_in_use[num + mnum - i1] == 1) {
cm.read_file(file, num + mnum - i1, dqc.spf);
} else if (DailyQcUtils.pcp_in_use[num + mnum] == 1) {
cm.read_file(file, num + mnum, spf);
} else if (DailyQcUtils.pcp_in_use[num + mnum - i1] == 1) {
cm.read_file(file, num + mnum - i1, spf);
}
}
if (dqc.pcp_in_use[num] == -1) {
if (DailyQcUtils.pcp_in_use[num] == -1) {
return;
}
cm.read_file(file, num, dqc.pcp);
cm.read_file(file, num, pcp);
buf = FloatBuffer.allocate(dqc.getHrap_grid().maxi * dqc.getHrap_grid().maxj);
buf = FloatBuffer.allocate(hrap_grid.maxi * hrap_grid.maxj);
/* Get value in the HRAP grid bins. */
// for (i = 0; i < (hrap_grid.maxi); i++) {
// for (j = 0; j < hrap_grid.maxj; j++) {
for (j = dqc.getHrap_grid().maxj - 1; j >= 0; j--) {
for (i = 0; i < dqc.getHrap_grid().maxi; i++) {
if (dqc.getHrap_grid().owner[i][j] == -1) {
for (j = hrap_grid.maxj - 1; j >= 0; j--) {
for (i = 0; i < hrap_grid.maxi; i++) {
if (hrap_grid.owner[i][j] == -1) {
continue;
}
@ -266,14 +264,14 @@ public class PlotGriddedPrecipResource extends
break;
}
if (dqc.getHrap_grid().owner[i][j] == wfo_in_use[m]) {
if (hrap_grid.owner[i][j] == wfo_in_use[m]) {
break;
}
}
}
Float fg = 0f;
value = dqc.pcp.value[i][j];
value = pcp.value[i][j];
// fg = (float) (value / 100.0);
if (fg.isNaN() || value < 0) {
fg = -9999f;
@ -302,8 +300,8 @@ public class PlotGriddedPrecipResource extends
}
buf.rewind();
Rectangle extent = new Rectangle(dqc.getHrap_grid().hrap_minx,
dqc.getHrap_grid().hrap_miny, dqc.getHrap_grid().maxi, dqc.getHrap_grid().maxj);
Rectangle extent = new Rectangle(hrap_grid.hrap_minx,
hrap_grid.hrap_miny, hrap_grid.maxi, hrap_grid.maxj);
if (extent.x == 0 && extent.y == 0) {
Rectangle coord = null;
@ -388,7 +386,7 @@ public class PlotGriddedPrecipResource extends
int x = p.x - extent.x;
int y = p.y - extent.y;
short s = (short) dqc.pcp.value[x][y];
short s = (short) pcp.value[x][y];
double d = parameters.getDataToDisplayConverter().convert(s);
@ -464,20 +462,21 @@ public class PlotGriddedPrecipResource extends
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
this.target = target;
time_pos = ddq.time_pos;
plot_gridded_precip(ddq.prefix, time_pos, 100);
time_pos = DrawDQCStations.time_pos;
plot_gridded_precip(DrawDQCStations.prefix, time_pos, 100);
}
@Override
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
if (buf == null || dqc.grids_flag != 1
if (buf == null || (DailyQcUtils.grids_flag != 1 && DailyQcUtils.contour_flag != 1)
|| displayMgr.isQpf() != true) {
return;
}
Set<DisplayMode> mode = displayMgr.getDisplayMode();
System.out.println("Mode is: "+mode.toString());
if (mode.contains(DisplayMode.Image)) {
if (gridDisplay == null) {
@ -514,11 +513,11 @@ public class PlotGriddedPrecipResource extends
*/
@Override
public String getName() {
if (ddq.qcmode == "") {
if (DrawDQCStations.qcmode == "") {
return "No Data Available";
}
return ddq.qcmode;
return DrawDQCStations.qcmode;
}
@Override

View file

@ -57,6 +57,7 @@ import com.raytheon.uf.viz.core.PixelCoverage;
import com.raytheon.uf.viz.core.PixelExtent;
import com.raytheon.uf.viz.core.RGBColors;
import com.raytheon.uf.viz.core.data.IRenderedImageCallback;
import com.raytheon.uf.viz.core.data.prep.IODataPreparer;
import com.raytheon.uf.viz.core.drawables.IFont;
import com.raytheon.uf.viz.core.drawables.IImage;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
@ -74,6 +75,8 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Ztn;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.index.strtree.STRtree;
import com.raytheon.viz.mpe.ui.dialogs.EditFreezeStationsDialog;
import com.raytheon.viz.mpe.util.DailyQcUtils.Zdata;
/**
* MPEMultiple point resource.
@ -113,6 +116,8 @@ public class PointFreezePlotResource extends
private double scaleHeightValue = 0.0;
private Station gageData = null;
private static final String[] color_map_a = { "Cyan1", "Salmon", "Orange1",
"Yellow1", "Magenta1", "Green1", "Green4", "Gray74", "White",
"Cyan1" };
@ -124,6 +129,10 @@ public class PointFreezePlotResource extends
private Hashtable<String, Ztn> zdataMap;
int pcpn_day = 0;
static int prevPcpnDay;
private final DailyQcUtils dqc = DailyQcUtils.getInstance();
/**
@ -162,12 +171,13 @@ public class PointFreezePlotResource extends
dataMap = new Hashtable<String, Station>();
zdataMap = new Hashtable<String, Ztn>();
strTree = new STRtree();
Station gageData = new Station();
ArrayList<Station> station = dqc.freezing_stations;
gageData = dqc.new Station();
prevPcpnDay = 0;
// ArrayList<Station> station = dqc.freezing_stations;
if (!station.isEmpty()) {
if (!dqc.freezing_stations.isEmpty()) {
int i = 0;
for (ListIterator<Station> it = station.listIterator(); it
for (ListIterator<Station> it = dqc.freezing_stations.listIterator(); it
.hasNext();) {
gageData = it.next();
Coordinate xy = new Coordinate();
@ -195,6 +205,7 @@ public class PointFreezePlotResource extends
strTree.insert(env, data);
i++;
}
prevPcpnDay = dqc.pcpn_day;
}
}

View file

@ -37,6 +37,8 @@ import javax.measure.unit.NonSI;
import javax.measure.unit.Unit;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.operation.TransformException;
@ -70,10 +72,8 @@ import com.raytheon.viz.mpe.ui.actions.DrawDQCStations;
import com.raytheon.viz.mpe.ui.actions.OtherPrecipOptions;
import com.raytheon.viz.mpe.ui.dialogs.QcPrecipOptionsDialog;
import com.raytheon.viz.mpe.util.DailyQcUtils;
import com.raytheon.viz.mpe.util.DailyQcUtils.Pdata;
import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
import com.raytheon.viz.mpe.util.DailyQcUtils.Stn;
import com.raytheon.viz.mpe.util.DailyQcUtils.Ts;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.index.strtree.STRtree;
@ -132,6 +132,8 @@ public class PointPrecipPlotResource extends
private Hashtable<String, Stn> pdataMap;
private final DailyQcUtils dqc = DailyQcUtils.getInstance();
static int prevPcpnDay;
/**
* Constructor.
@ -148,6 +150,7 @@ public class PointPrecipPlotResource extends
public PointPrecipPlotResource(PointPrecipResourceData resourceData,
LoadProperties props) {
super(resourceData, props);
prevPcpnDay = 0;
df.setMaximumFractionDigits(2);
df.setMaximumIntegerDigits(4);
}
@ -169,12 +172,13 @@ public class PointPrecipPlotResource extends
dataMap = new Hashtable<String, Station>();
pdataMap = new Hashtable<String, Stn>();
strTree = new STRtree();
gageData = new Station();
ArrayList<Station> station = dqc.precip_stations;
if (!station.isEmpty()) {
gageData = dqc.new Station();
if (!station.isEmpty()) {
if (!dqc.precip_stations.isEmpty()) {
int i = 0;
Pdata[] pdata = dqc.pdata;
for (ListIterator<Station> it = station.listIterator(); it
for (ListIterator<Station> it = dqc.precip_stations.listIterator(); it
.hasNext();) {
gageData = it.next();
Coordinate xy = new Coordinate();
@ -187,7 +191,7 @@ public class PointPrecipPlotResource extends
kv.append(":");
kv.append(pm);
dataMap.put(kv.toString(), gageData);
pdataMap.put(kv.toString(), pdata[dqc.pcpn_day].stn[i]);
pdataMap.put(kv.toString(), DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[i]);
/* Create a small envelope around the point */
Coordinate p1 = new Coordinate(xy.x + .02, xy.y + .02);
@ -195,11 +199,14 @@ public class PointPrecipPlotResource extends
Envelope env = new Envelope(p1, p2);
ArrayList<Object> data = new ArrayList<Object>();
data.add(xy);
data.add("STATION: " + gageData.hb5 + " VALUE: "
+ pdata[dqc.pcpn_day].stn[i].frain[time_pos].data);
data.add("STATION: "
+ gageData.hb5
+ " VALUE: "
+ DailyQcUtils.pdata[DailyQcUtils.pcpn_day].stn[i].frain[time_pos].data);
strTree.insert(env, data);
i++;
}
prevPcpnDay = DailyQcUtils.pcpn_day;
}
// target.setNeedsRefresh(true);
}
@ -265,26 +272,23 @@ public class PointPrecipPlotResource extends
IFont font) throws VizException {
if ((MPEDisplayManager.getCurrent().isQpf() == true)
&& (dqc.points_flag == 1)) {
int type = dqc.plot_view;
&& (DailyQcUtils.points_flag == 1)) {
int type = DailyQcUtils.plot_view;
int i = 0;
int m = 0;
int dcmode = OtherPrecipOptions.dcmode;
int tcmode = OtherPrecipOptions.tcmode;
int dmvalue = dqc.dmvalue;
Ts ts[] = dqc.ts;
int tsmax = dqc.tsmax;
boolean frzlvl_flag = dqc.frzlvl_flag;
int gage_char[] = dqc.gage_char;
int find_station_flag = dqc.find_station_flag;
int dflag[] = dqc.dflag;
int qflag[] = dqc.qflag;
String mbuf = "";
String tbuf = "";
String val = "";
if (MPEDisplayManager.pcpn_time_step == 0) {
time_pos = dqc.pcpn_time;
time_pos = DailyQcUtils.pcpn_time;
} else {
time_pos = 4;
}
@ -296,7 +300,7 @@ public class PointPrecipPlotResource extends
double[] centerpixels = descriptor.worldToPixel(new double[] { c.x,
c.y });
color = RGBColors.getRGBColor(color_map_n[15]);
if ((dqc.points_flag == 1)
if ((DailyQcUtils.points_flag == 1)
&& (QcPrecipOptionsDialog.isOpen == true)
&& (MPEDisplayManager.getCurrent().isQpf() == true)) {
} else {
@ -333,7 +337,7 @@ public class PointPrecipPlotResource extends
for (m = 0; m < tsmax; m++) {
if (station.parm.substring(3, 5).equalsIgnoreCase(ts[m].abr)
&& (dflag[m + 1] == 1)) {
&& (DailyQcUtils.dflag[m + 1] == 1)) {
break;
}
}
@ -361,8 +365,8 @@ public class PointPrecipPlotResource extends
/* locate station in data stream */
if (((type == 4) || (type == 5))
&& (dqc.pdata[dqc.pcpn_day].used[time_pos] == 0)
&& (dqc.pdata[dqc.pcpn_day].level == 0)) {
&& (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].used[time_pos] == 0)
&& (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].level == 0)) {
return;
}
if (((type == 4) || (type == 5))
@ -408,8 +412,8 @@ public class PointPrecipPlotResource extends
tbuf = station.name;
} else if (type == 4) {
if ((dqc.pdata[dqc.pcpn_day].used[time_pos] == 0)
&& (dqc.pdata[dqc.pcpn_day].level == 0)) {
if ((DailyQcUtils.pdata[DailyQcUtils.pcpn_day].used[time_pos] == 0)
&& (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].level == 0)) {
return;
}
@ -433,8 +437,8 @@ public class PointPrecipPlotResource extends
tbuf = mbuf;
} else if (type == 5) {
if ((dqc.pdata[dqc.pcpn_day].used[time_pos] == 0)
&& (dqc.pdata[dqc.pcpn_day].level == 0)) {
if ((DailyQcUtils.pdata[DailyQcUtils.pcpn_day].used[time_pos] == 0)
&& (DailyQcUtils.pdata[DailyQcUtils.pcpn_day].level == 0)) {
return;
}
@ -699,7 +703,7 @@ public class PointPrecipPlotResource extends
// Fonts are shared and cached, no need to init or dispose
IFont font = fontFactory.getMPEFont(MPEDisplayManager.getFontId());
if ((dqc.points_flag == 1) && (displayMgr.isQpf() == true)) {
if ((DailyQcUtils.points_flag == 1) && (displayMgr.isQpf() == true)) {
Iterator<String> iter = dataMap.keySet().iterator();
while (iter.hasNext()) {

View file

@ -118,6 +118,8 @@ public class PointTempPlotResource extends
private double scaleHeightValue = 0.0;
private Station gageData = null;
private static final String[] color_map_a = { "Cyan1", "Salmon", "Orange1",
"Yellow1", "Magenta1", "Green1", "Green4", "Gray74", "White",
"Cyan1" };
@ -131,6 +133,10 @@ public class PointTempPlotResource extends
private Hashtable<String, Ttn> tdataMap;
int pcpn_day = 0;
static int prevPcpnDay;
private final DailyQcUtils dqc = DailyQcUtils.getInstance();
/**
@ -169,13 +175,14 @@ public class PointTempPlotResource extends
dataMap = new Hashtable<String, Station>();
tdataMap = new Hashtable<String, Ttn>();
strTree = new STRtree();
Station gageData = new Station();
gageData = dqc.new Station();
ArrayList<Station> station = dqc.temperature_stations;
Tdata[] tdata = dqc.tdata;
prevPcpnDay = 0;
if (!station.isEmpty()) {
if (!dqc.temperature_stations.isEmpty()) {
int i = 0;
for (ListIterator<Station> it = station.listIterator(); it
for (ListIterator<Station> it = dqc.temperature_stations.listIterator(); it
.hasNext();) {
gageData = it.next();
Coordinate xy = new Coordinate();
@ -188,7 +195,7 @@ public class PointTempPlotResource extends
kv.append(":");
kv.append(pm);
dataMap.put(kv.toString(), gageData);
tdataMap.put(kv.toString(), tdata[dqc.pcpn_day].tstn[i]);
tdataMap.put(kv.toString(), dqc.tdata[dqc.pcpn_day].tstn[i]);
/* Create a small envelope around the point */
Coordinate p1 = new Coordinate(xy.x + .02, xy.y + .02);
@ -197,10 +204,11 @@ public class PointTempPlotResource extends
ArrayList<Object> data = new ArrayList<Object>();
data.add(xy);
data.add("STATION: " + gageData.hb5 + " VALUE: "
+ tdata[dqc.pcpn_day].tstn[i].tlevel2[time_pos].data);
+ dqc.tdata[dqc.pcpn_day].tstn[i].tlevel2[time_pos].data);
strTree.insert(env, data);
i++;
}
prevPcpnDay = dqc.pcpn_day;
}
}

View file

@ -85,7 +85,7 @@ public class DailyQcUtils {
private String lastQcArea = "";
public String currentQcArea;
public static String currentQcArea;
private Date currDate;
@ -101,7 +101,7 @@ public class DailyQcUtils {
public int init_maxmin = -1;
public int pcp_in_use[] = new int[500];
public static int pcp_in_use[] = new int[500];
boolean newarea = false;
@ -171,13 +171,13 @@ public class DailyQcUtils {
public int method = 2;
public boolean wfo_all = false;
public static boolean wfo_all = false;
public boolean render_all = true;
public int wfo_orig;
public int[] wfo_in_use = new int[20];
public static int[] wfo_in_use = new int[20];
public String[] tag = new String[20];
@ -261,39 +261,39 @@ public class DailyQcUtils {
public String mpe_show_missing_gage;
public int isom = -1;
public static int isom = -1;
public int old_isom = -1;
public static int old_isom = -1;
public ArrayList<Station> precip_stations = new ArrayList<Station>();
public static ArrayList<Station> precip_stations = new ArrayList<Station>();
public ArrayList<Station> temperature_stations = new ArrayList<Station>();
public static ArrayList<Station> temperature_stations = new ArrayList<Station>();
public ArrayList<Station> freezing_stations = new ArrayList<Station>();
public static ArrayList<Station> freezing_stations = new ArrayList<Station>();
public Pdata pdata[];
public static Pdata pdata[];
public Tdata tdata[];
public static Tdata tdata[];
public Zdata zdata[];
public static Zdata zdata[];
private Hrap_Grid hrap_grid = new Hrap_Grid();
private static Hrap_Grid hrap_grid = new Hrap_Grid();
// public static Hrap_Grid hrap_tgrid = new Hrap_Grid();
public static String type = "QME ";
public Ts[] ts;
public static Ts[] ts;
public int tsmax = 0;
public static int tsmax = 0;
public Maps mean_areal_precip_global[];
public Pcp pcp = new Pcp();
public static Pcp pcp = new Pcp();
public Pcp spf = new Pcp();
public static Pcp spf = new Pcp();
public Pcp tpf = new Pcp();
public static Pcp tpf = new Pcp();
public Bad_Daily_Values bad_values[];
@ -441,15 +441,15 @@ public class DailyQcUtils {
public static int hrgt12z = -1;
public int[] dflag = new int[10];
public static int[] dflag = new int[10];
public int[] qflag = new int[10];
public static int[] qflag = new int[10];
public float pxtemp = 1.0f;
public int dmvalue = (int) ((1.0 * 100 * 3.28) / .55);
public int elevation_filter_value = 0;
public static int elevation_filter_value = 0;
public int temperature_filter_value = -50;
@ -472,27 +472,27 @@ public class DailyQcUtils {
/* Function which associates the Gage QC edit levels with a value. */
public int funct[] = { 8, 0, 6, 2, 3, 4, 5, 1, 7, 9 };
public int gage_char[] = new int[2];
public static int gage_char[] = new int[2];
public int plot_view = 0;
public static int plot_view = 0;
public boolean frzlvl_flag = true;
public int find_station_flag = -1;
public int pcpn_time = 0;
public static int pcpn_time = 0;
public int pcp_flag = -1;
public static int pcp_flag = -1;
public int pcpn_day = 0;
public static int pcpn_day = 0;
public int contour_flag = -1;
public static int contour_flag = -1;
public int points_flag = 1;
public static int points_flag = 1;
public int grids_flag = -1;
public static int grids_flag = -1;
public int map_flag = -1;
public static int map_flag = -1;
static int curHrMinSec = -1;
@ -815,7 +815,7 @@ public class DailyQcUtils {
float fvalue;
}
public static class Station {
public class Station {
public float isoh[];
public float max[];
@ -901,7 +901,7 @@ public class DailyQcUtils {
return retval;
}
public int getEnding6HourObsTime() {
public static int getEnding6HourObsTime() {
String s = appsDefaults.getToken(dqc_ending_6hour_obstime_tok);
int value = ((!(null == s)) ? Integer.parseInt(s) : -1);
@ -915,6 +915,9 @@ public class DailyQcUtils {
String currntQcArea, int days, boolean autoqc) {
currentQcArea = currntQcArea;
currDate = currentDate;
if (prevDate == null){
prevDate = currDate;
}
selDate = prevDate;
auto_dailyqc_flag = autoqc;
qcDays = MPEDataManager.getInstance().getDQCDays();
@ -1044,7 +1047,6 @@ public class DailyQcUtils {
*/
Calendar currentTime = Calendar
.getInstance(TimeZone.getTimeZone("GMT"));
emonth = btime.get(Calendar.MONTH);
Calendar otime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
otime.setTime(btime.getTime());
@ -2129,7 +2131,7 @@ public class DailyQcUtils {
/**
* @return the hrap_grid
*/
public Hrap_Grid getHrap_grid() {
public static Hrap_Grid getHrap_grid() {
return hrap_grid;
}

View file

@ -368,7 +368,7 @@ public class Disagg6Hr {
values6hr = new Values_6hr[(dqc.qcDays * num_disagg_stations)];
for (int z = 0; z < (dqc.qcDays * num_disagg_stations); z++) {
disagg_station_6hr[z] = new Station();
disagg_station_6hr[z] = dqc.new Station();
disaggValues[z] = new Values_1hr();
values6hr[z] = new Values_6hr();
}

View file

@ -100,7 +100,7 @@ public class InitPrecipClimo {
// if (precip_stations.get(index).parm.charAt(4) ==
// tokens[1]
// .charAt(4)) {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = precip_stations.get(index);
for (int m = 0; m < 12; m++) {
nstation.isoh[m] = Float.parseFloat(tokens[m + 2]);
@ -145,7 +145,7 @@ public class InitPrecipClimo {
if ((precip_stations.get(index).isoh[0] < 0)
|| (precip_stations.get(index).cparm
.equalsIgnoreCase("PPMPBCM"))) {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = precip_stations.get(index);
for (int m = 0; m < 12; m++) {
@ -174,7 +174,7 @@ public class InitPrecipClimo {
if ((precip_stations.get(index).isoh[0] < 0)
|| (precip_stations.get(index).cparm
.equalsIgnoreCase("PPMPBCM"))) {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = precip_stations.get(index);
for (int m = 0; m < 12; m++) {
@ -195,7 +195,7 @@ public class InitPrecipClimo {
int oldk = -1;
int k;
Station astation = new Station();
Station astation = dc.new Station();
for (int kk = 0; kk < 12; kk++) {
if (kk < 3) {

View file

@ -114,7 +114,7 @@ public class InitTempClimo {
/* Increment the station array index. */
++index;
} else {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = temperature_stations.get(index);
if ((tokens[1].charAt(5) == 'X')
@ -161,7 +161,7 @@ public class InitTempClimo {
/* Increment the station array index. */
++index;
} else {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = temperature_stations.get(index);
/*
* Is the extremum code 'Maximum'? Of temperature,
@ -246,7 +246,7 @@ public class InitTempClimo {
/* Increment the station array index. */
++index;
} else {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = temperature_stations.get(index);
if ((tokens[1].charAt(5) == 'X')
@ -309,7 +309,7 @@ public class InitTempClimo {
.get(index).min[0] < 0))
|| temperature_stations.get(index).cparm.substring(
0, 5).equalsIgnoreCase("TAIPB")) {
Station nstation = new Station();
Station nstation = dc.new Station();
nstation = temperature_stations.get(index);
/*
* Is the extremum code 'Maximum'? Of temperature,

View file

@ -262,7 +262,7 @@ public class MapFreezingGagesGrid {
* Update the precip station list to contain the nearest freezing level
* stations.
*/
Station station = new Station();
Station station = dqc.new Station();
for (i = 0; i < numPstations; i++) {
station = precip_stations.get(i);

View file

@ -90,8 +90,9 @@ public class MeanMonthlyPrecip {
displayUnit = NonSI.INCH;
dataUnit = SI.MILLIMETER;
cmc.setDisplayUnit(displayUnit);
cmc.setColorMapUnit(SI.MILLIMETER);
cmc.setDataUnit(dataUnit);
UnitConverter dataToImage = cmc.getDataToImageConverter();
UnitConverter dataToImage = cmc.getColorMapToDisplayConverter();//cmc.getDataToImageConverter();
/*
* Loop over the months. Determine for which months PRISM data are

View file

@ -144,7 +144,7 @@ public class ReadFreezingStationList {
tokens = null;
}
if ((tokens != null) && (tokens.length == 7)) {
Station astation = new Station();
Station astation = dqc.new Station();
astation.hb5 = tokens[0].toString().trim();
astation.parm = tokens[1].toString().trim();
double lat = Double.parseDouble(tokens[2].trim());
@ -233,7 +233,7 @@ public class ReadFreezingStationList {
.substring(0, 2)))
&& (record[1]
.equalsIgnoreCase(stations.get(i).parm))) {
Station statn = new Station();
Station statn = dqc.new Station();
statn = stations.get(i);
statn.xadd = Integer.parseInt(record[2].trim());
statn.yadd = Integer.parseInt(record[3].trim());

View file

@ -74,7 +74,7 @@ public class ReadPrecipStationList {
e.printStackTrace();
}
ReadPrecipStationList.max_pstations = dqc.precip_stations.size();
max_pstations = dqc.precip_stations.size();
return dqc.precip_stations;
@ -123,7 +123,7 @@ public class ReadPrecipStationList {
tokens = null;
}
if ((tokens != null) && (tokens.length == 7)) {
Station astation = new Station();
Station astation = dqc.new Station();
astation.hb5 = tokens[0].toString().trim();
astation.parm = tokens[1].toString().trim();
double lat = Double.parseDouble(tokens[2]);
@ -204,7 +204,7 @@ public class ReadPrecipStationList {
if ((record[1].substring(0, 2).compareTo(
stations.get(i).parm.substring(0, 2)) == 0)
&& (record[1].equals(stations.get(i).parm))) {
Station statn = new Station();
Station statn = dqc.new Station();
statn = stations.get(i);
statn.xadd = Integer.parseInt(record[2]);
statn.yadd = Integer.parseInt(record[3]);
@ -237,8 +237,8 @@ public class ReadPrecipStationList {
int qcn = dqc.mpe_dqc_max_precip_neighbors;
double sorted[] = new double[qcn];
double dist;
Station stati = new Station();
Station statm = new Station();
Station stati = dqc.new Station();
Station statm = dqc.new Station();
stati.index = new short[qcn];
statm.index = new short[qcn];

View file

@ -112,7 +112,7 @@ public class ReadQPFGrids {
} else {
iflag = 0;
}
for (i = 0; i < gmaxi; i++) {
for (i = 0; i < (dqc.getHrap_grid().maxi); i++) {
if (iflag == 0) {
kbuf = in.readLine().trim();
@ -130,7 +130,7 @@ public class ReadQPFGrids {
// if (ghrapi > minhrapi && ghrapi <= maxhrapi) {
for (j = 0; j < gmaxj; j++) {
for (j = 0; j < (dqc.getHrap_grid().maxj); j++) {
// ghrapj = gminj + j;
//

View file

@ -86,6 +86,7 @@ public class ReadSnowData {
}
}
in = new BufferedReader(new FileReader(prece));
System.out.println("Reading Snow data from : " + prece);
// int p = 1;
// String sn = cbuf;
@ -168,6 +169,7 @@ public class ReadSnowData {
dqc.pdata[i].stn[j].srain[kk].data = Float.parseFloat(qbuf);
dqc.pdata[i].stn[j].srain[kk].qual = 8;
System.out.println("Loading Snow Data for Station "+ hb5 +" with value: "+ dqc.pdata[i].stn[j].srain[kk].data);
break;

View file

@ -83,7 +83,7 @@ public class ReadTemperatureStationList {
e.printStackTrace();
}
ReadTemperatureStationList.max_tstations = dqc.temperature_stations
max_tstations = dqc.temperature_stations
.size();
return dqc.temperature_stations;
@ -136,7 +136,7 @@ public class ReadTemperatureStationList {
tokens = null;
}
if ((tokens != null) && (tokens.length == 7)) {
Station astation = new Station();
Station astation = dqc.new Station();
astation.hb5 = tokens[0].toString().trim();
astation.parm = tokens[1].toString().trim();
double lat = Double.parseDouble(tokens[2].trim());
@ -231,7 +231,7 @@ public class ReadTemperatureStationList {
.substring(0, 2)))
&& (record[1]
.equalsIgnoreCase(stations.get(i).parm))) {
Station statn = new Station();
Station statn = dqc.new Station();
statn = stations.get(i);
statn.xadd = Integer.parseInt(record[2].trim());
statn.yadd = Integer.parseInt(record[3].trim());
@ -268,8 +268,8 @@ public class ReadTemperatureStationList {
int qcn = dqc.mpe_dqc_max_temp_neighbors;
double sorted[] = new double[qcn];
double dist;
Station stati = new Station();
Station statm = new Station();
Station stati = dqc.new Station();
Station statm = dqc.new Station();
for (i = 0; i < max_tstations; i++) {
stati = stations.get(i);

View file

@ -197,7 +197,7 @@ public class StationListManager {
(stationTokens.length == 7) && // input is valid and
(inputLine.charAt(0) != '#')) // not a comment
{
Station aStation = new Station();
Station aStation = dqc.new Station();
aStation.hb5 = stationTokens[0].toString().trim(); // Location
// ID
aStation.parm = stationTokens[1].toString().trim();

View file

@ -278,6 +278,12 @@
input="${edex.component}"
regexp="com-raytheon-uf-(.+)-feature"
select="\1" />
<propertyregex property="edex.component"
override="true"
input="${edex.component}"
regexp="^(?:edu|gov)-.*(edex-.+)-feature"
select="\1" />
<!-- Create the distribution directory. -->
<mkdir dir="${builder}/dist" />

View file

@ -36,7 +36,7 @@
<!-- activeTableChange log -->
<appender name="activeTableLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<appender name="activeTableChangeLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${edex.home}/logs/edex-${edex.run.mode}-activeTableChange-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory>

View file

@ -417,8 +417,13 @@
<bean id="sbLockMgr" class="com.raytheon.edex.plugin.gfe.server.handler.svcbu.ServiceBackupLockManager"
factory-method="getInstance"/>
<bean id="productPurger" class="com.raytheon.uf.common.dataplugin.gfe.util.FilePurger">
<constructor-arg value="/awips2/GFESuite/products"/> <!-- directory to be purged -->
<bean id="productIscPurger" class="com.raytheon.uf.common.dataplugin.gfe.util.FilePurger">
<constructor-arg value="/awips2/GFESuite/products/ISC"/> <!-- directory to be purged -->
<constructor-arg value="2419200000"/> <!-- purge age: 28 days in milliseconds -->
</bean>
<bean id="productAtblPurger" class="com.raytheon.uf.common.dataplugin.gfe.util.FilePurger">
<constructor-arg value="/awips2/GFESuite/products/ATBL"/> <!-- directory to be purged -->
<constructor-arg value="2419200000"/> <!-- purge age: 28 days in milliseconds -->
</bean>
@ -426,7 +431,8 @@
<endpoint id="exportDigitalDataCron" uri="clusteredquartz://gfe/exportDigitalData/?cron=${gfe.cron}"/>
<endpoint id="gfeLogPurgeCron" uri="clusteredquartz://gfe/purgeGfeLogs/?cron=${purge.gfe.logs.cron}"/>
<endpoint id="gfeProductPurgeCron" uri="clusteredquartz://gfe/purgeGfeProducts/?cron=${purge.gfe.products.cron}"/>
<endpoint id="gfeProductIscPurgeCron" uri="clusteredquartz://gfe/purgeGfeProductsIsc/?cron=${purge.gfe.products.isc.cron}"/>
<endpoint id="gfeProductAtblPurgeCron" uri="clusteredquartz://gfe/purgeGfeProductsAtbl/?cron=${purge.gfe.products.atbl.cron}"/>
<endpoint id="svcbuLogPurgeCron" uri="clusteredquartz://gfe/purgeSvcbuLogs/?cron=${purge.svcbu.logs.cron}"/>
<endpoint id="iscSendLauncher" uri="quartz://iscSendThread?trigger.repeatCount=0&amp;trigger.repeatInterval=1"/>
<endpoint id="gfeClearOrphanedLocksCron" uri="clusteredquartz://gfe/clearGfeOrhpanedLocks/?cron=${clear.gfe.orphaned.locks.cron}"/>
@ -468,14 +474,30 @@
</doTry>
</route>
<route id="purgeGfeProducts">
<from uri="gfeProductPurgeCron"/>
<to uri="jms-generic:queue:purgeGfeProductWork"/>
<route id="purgeGfeProductsIsc">
<from uri="gfeProductIscPurgeCron"/>
<to uri="jms-generic:queue:purgeGfeProductIscWork"/>
</route>
<route id="purgeGfeProductWork">
<from uri="jms-generic:queue:purgeGfeProductWork"/>
<route id="purgeGfeProductIscWork">
<from uri="jms-generic:queue:purgeGfeProductIscWork"/>
<doTry>
<bean ref="productPurger" method="purge"/>
<bean ref="productIscPurger" method="purge"/>
<doCatch>
<exception>java.lang.Throwable</exception>
<to
uri="log:svcBackup?level=ERROR"/>
</doCatch>
</doTry>
</route>
<route id="purgeGfeProductsAtbl">
<from uri="gfeProductAtblPurgeCron"/>
<to uri="jms-generic:queue:purgeGfeProductAtblWork"/>
</route>
<route id="purgeGfeProductAtblWork">
<from uri="jms-generic:queue:purgeGfeProductAtblWork"/>
<doTry>
<bean ref="productAtblPurger" method="purge"/>
<doCatch>
<exception>java.lang.Throwable</exception>
<to

View file

@ -11,7 +11,8 @@ purge.gfe.logs.cron=0+30+0+*+*+?
purge.svcbu.logs.cron=0+30+0+*+*+?
# Interval at which the gfe products are purged
purge.gfe.products.cron=0+45+0+*+*+?
purge.gfe.products.isc.cron=0+45+0+*+*+?
purge.gfe.products.atbl.cron=0+50+0+*+*+?
# Interval at which the gfe orphaned locks are cleared
clear.gfe.orphaned.locks.cron = 0+0/10+*+*+*+?
clear.gfe.orphaned.locks.cron = 0+0/10+*+*+*+?

View file

@ -30,6 +30,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import jep.JepException;
import com.google.common.util.concurrent.MoreExecutors;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.exception.GfeMissingConfigurationException;
@ -38,12 +40,21 @@ import com.raytheon.edex.plugin.gfe.server.IFPServer;
import com.raytheon.edex.site.SiteUtil;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
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.python.PyUtil;
import com.raytheon.uf.common.python.PythonScript;
import com.raytheon.uf.common.site.notify.SiteActivationNotification;
import com.raytheon.uf.common.site.notify.SiteActivationNotification.ACTIVATIONSTATUS;
import com.raytheon.uf.common.site.notify.SiteActivationNotification.ACTIVATIONTYPE;
import com.raytheon.uf.common.status.IUFStatusHandler;
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.edex.activetable.ActiveTablePyIncludeUtil;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.raytheon.uf.edex.core.EdexException;
import com.raytheon.uf.edex.database.DataAccessLayerException;
@ -79,7 +90,9 @@ import com.raytheon.uf.edex.site.notify.SendSiteActivationNotifications;
* May 15, 2014 #3157 dgilling Mark getActiveSites() as deprecated.
* Jul 09, 2014 #3146 randerso Eliminated redundant evaluation of serverConfig
* Sent activation failure message to alertViz
* Oct 07, 2014 #3684 randerso Restructured IFPServer start up
* Oct 07, 2014 #3684 randerso Restructured IFPServer start up
* Dec 10, 2014 #4953 randerso Added requestTCVFiles call at site activation
*
* </pre>
*
* @author njensen
@ -325,6 +338,21 @@ public class GFESiteActivation implements ISiteActivationListener {
try {
IRTManager.getInstance().enableISC(siteID, config);
isIscActivated = true;
// wait until EDEX is up and running to request TCV files
final IFPServerConfig configRef = config;
Runnable requestTCV = new Runnable() {
@Override
public void run() {
EDEXUtil.waitForRunning();
requestTCVFiles(siteID, configRef);
}
};
postActivationTaskExecutor.submit(requestTCV);
} catch (Exception e) {
statusHandler
.error("Error starting GFE ISC. ISC functionality will be unavailable!!",
@ -478,4 +506,45 @@ public class GFESiteActivation implements ISiteActivationListener {
return retVal;
}
private void requestTCVFiles(String siteId, IFPServerConfig config) {
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext commonBaseCx = pathMgr.getContext(
LocalizationType.COMMON_STATIC, LocalizationLevel.BASE);
String scriptPath = pathMgr.getFile(commonBaseCx,
FileUtil.join(ActiveTablePyIncludeUtil.VTEC, "requestTCV.py"))
.getPath();
String pythonIncludePath = PyUtil.buildJepIncludePath(
ActiveTablePyIncludeUtil.getCommonPythonIncludePath(),
ActiveTablePyIncludeUtil.getCommonGfeIncludePath(),
ActiveTablePyIncludeUtil.getVtecIncludePath(siteId),
ActiveTablePyIncludeUtil.getGfeConfigIncludePath(siteId),
ActiveTablePyIncludeUtil.getIscScriptsIncludePath());
PythonScript script = null;
try {
script = new PythonScript(scriptPath, pythonIncludePath, this
.getClass().getClassLoader());
try {
Map<String, Object> argMap = new HashMap<String, Object>();
argMap.put("siteID", siteId);
argMap.put("config", config);
script.execute("runFromJava", argMap);
} catch (JepException e) {
statusHandler.handle(Priority.PROBLEM,
"Error executing requestTCV.", e);
}
} catch (JepException e) {
statusHandler
.handle(Priority.PROBLEM,
"Unable to instantiate requestTCV python script object.",
e);
} finally {
if (script != null) {
script.dispose();
}
}
}
}

View file

@ -56,9 +56,10 @@ import com.raytheon.uf.edex.site.SiteAwareRegistry;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 05, 2012 #361 dgilling Initial creation
* Mar 12, 2013 #1759 dgilling Re-implement using IscScript.
* Mar 14, 2013 1794 djohnson Consolidate common FilenameFilter implementations.
* Mar 05, 2012 #361 dgilling Initial creation
* 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
*
* </pre>
*
@ -144,6 +145,7 @@ 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>");
@ -186,18 +188,40 @@ public class IscReceiveSrv {
if (activeSites.contains(site)
&& IFPServerConfigManager.getServerConfig(site)
.requestISC()) {
String newFileName = dataFileName + "." + site;
String newXmlFileName = xmlFileName + "." + site;
try {
FileUtil.copyFile(new File(dataFileName), new File(
newFileName));
} catch (IOException e) {
statusHandler.error("Failed to copy: ["
+ dataFileName + "] to " + newFileName
+ ". Unable to execute iscDataRec for "
+ site, e);
continue;
String[] modifiedArgs = new String[args.length];
System.arraycopy(args, 0, modifiedArgs, 0, args.length);
if (dataFileName != null) {
String newFileName = dataFileName + "." + site;
try {
FileUtil.copyFile(new File(dataFileName),
new File(newFileName));
} catch (IOException e) {
statusHandler
.error("Failed to copy: ["
+ dataFileName
+ "] to "
+ newFileName
+ ". Unable to execute iscDataRec for "
+ site, e);
continue;
}
if (!new File(newFileName).exists()) {
statusHandler
.error("Failed to copy: ["
+ dataFileName
+ "] to "
+ newFileName
+ ". Unable to execute iscDataRec for "
+ site);
continue;
}
modifiedArgs[2] = modifiedArgs[2].replace(
dataFileName, newFileName);
}
String newXmlFileName = xmlFileName + "." + site;
try {
FileUtil.copyFile(new File(xmlFileName), new File(
newXmlFileName));
@ -208,14 +232,6 @@ public class IscReceiveSrv {
+ site, e);
continue;
}
if (!new File(newFileName).exists()) {
statusHandler.error("Failed to copy: ["
+ dataFileName + "] to " + newFileName
+ ". Unable to execute iscDataRec for "
+ site);
continue;
}
if (!new File(newXmlFileName).exists()) {
statusHandler.error("Failed to copy: ["
+ xmlFileName + "] to " + newXmlFileName
@ -224,24 +240,23 @@ public class IscReceiveSrv {
continue;
}
String[] modifiedArgs = new String[args.length];
System.arraycopy(args, 0, modifiedArgs, 0, args.length);
modifiedArgs[2] = modifiedArgs[2].replace(dataFileName,
newFileName);
modifiedArgs[2] = modifiedArgs[2].replace(xmlFileName,
newXmlFileName);
siteMap.put(site, modifiedArgs);
}
}
} finally {
File dataFile = new File(dataFileName);
File xmlFile = incomingXMLFile;
if (dataFile.exists()) {
if (!dataFile.delete()) {
statusHandler.error("Unable to delete " + dataFileName);
if (dataFileName != null) {
File dataFile = new File(dataFileName);
if (dataFile.exists()) {
if (!dataFile.delete()) {
statusHandler.error("Unable to delete "
+ dataFileName);
}
}
}
File xmlFile = incomingXMLFile;
if (xmlFile.exists()) {
if (!xmlFile.delete()) {
statusHandler.error("Unable to delete " + xmlFileName);

View file

@ -45,11 +45,13 @@ import com.raytheon.uf.common.util.FileUtil;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 11, 2013 dgilling Initial creation
* May 22, 2013 #1759 dgilling Ensure addSitePath() also adds base
* path.
* May 31, 2013 #1759 dgilling Ensure any site-specific paths are
* always removed post-execution.
* Mar 11, 2013 dgilling Initial creation
* May 22, 2013 #1759 dgilling Ensure addSitePath() also adds base
* path.
* May 31, 2013 #1759 dgilling Ensure any site-specific paths are
* always removed post-execution.
* Dec 08, 2014 #4953 randerso Updated Jep include path to allow use of
* LocalizationSupport and TCVUtil
*
* </pre>
*
@ -82,6 +84,8 @@ public class IscScript extends PythonScript {
private static String buildIncludePath() {
return PyUtil.buildJepIncludePath(
GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getCommonGfeIncludePath(),
GfePyIncludeUtil.getVtecIncludePath(),
GfePyIncludeUtil.getIscScriptsIncludePath());
}

View file

@ -61,6 +61,8 @@ import com.raytheon.uf.edex.database.tasks.SqlQueryTask;
* Oct 8, 2014 #4953 randerso Added hooks for TCVAreaDictionary creation
* Oct 10, 2014 #3685 randerso Add code to generate the fips2cities and zones2cites
* python modules from the GIS database tables
* Dec 08, 2014 #4953 randerso Updated Jep include path to allow use of
* LocalizationSupport
*
* </pre>
*
@ -243,7 +245,9 @@ public class AreaDictionaryMaker {
String includePath = PyUtil.buildJepIncludePath(true,
GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getCommonGfeIncludePath(),
configDir.getPath(), scriptFile.getParent());
Map<String, Object> argMap = new HashMap<String, Object>();
LocalizationContext caveStaticConfig = pathMgr.getContext(

View file

@ -58,8 +58,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
public abstract class AbstractWatchNotifierSrv {
protected final IUFStatusHandler statusHandler = UFStatus
.getHandler(getClass());
protected static final IUFStatusHandler statusHandler = UFStatus
.getHandler(AbstractWatchNotifierSrv.class);
protected final String watchType;

View file

@ -20,6 +20,11 @@
package com.raytheon.edex.plugin.gfe.watch;
import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@ -27,9 +32,13 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jep.JepException;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
import com.raytheon.edex.plugin.gfe.server.IFPServer;
import com.raytheon.uf.common.activetable.VTECPartners;
import com.raytheon.uf.common.dataplugin.gfe.python.GfePyIncludeUtil;
import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord;
@ -44,8 +53,10 @@ import com.raytheon.uf.common.localization.exception.LocalizationOpFailedExcepti
import com.raytheon.uf.common.python.PyUtil;
import com.raytheon.uf.common.python.PythonScript;
import com.raytheon.uf.common.site.SiteMap;
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.common.util.RunProcess;
import com.raytheon.uf.edex.activetable.ActiveTablePyIncludeUtil;
/**
* Watches ingested warnings for WOU products from the SPC (Storm Prediction
@ -66,7 +77,9 @@ import com.raytheon.uf.common.util.file.FilenameFilters;
* Changed to use Python to store TCVAdvisory files
* Added code to keep practice and operational
* advisory files separated
*
* Added call to nwrwavestcv.csh
* Added support for sending TCVAdvisory files to
* VTEC partners
* </pre>
*
* @author njensen
@ -74,6 +87,8 @@ import com.raytheon.uf.common.util.file.FilenameFilters;
*/
public final class TPCWatchSrv extends AbstractWatchNotifierSrv {
private static final String NWRWAVES_SCRIPT = "/awips/adapt/NWRWAVES/nwrwavestcv.csh ";
private static final String TCV_ADVISORY_PATH = FileUtil.join("gfe",
"tcvAdvisories");
@ -109,7 +124,7 @@ public final class TPCWatchSrv extends AbstractWatchNotifierSrv {
actMap = Collections.unmodifiableMap(actMapTemp);
}
private ThreadLocal<PythonScript> pythonScript = new ThreadLocal<PythonScript>() {
private static final ThreadLocal<PythonScript> pythonScript = new ThreadLocal<PythonScript>() {
/*
* (non-Javadoc)
@ -140,6 +155,13 @@ public final class TPCWatchSrv extends AbstractWatchNotifierSrv {
};
// regex to parse storm name and advisory number from HLS MND header
private static final Pattern mndPattern = Pattern.compile(
"^.*\\s(?<stormName>\\w+)\\sLOCAL STATEMENT "
+ "(?<advisoryType>SPECIAL |INTERMEDIATE )?"
+ "(ADVISORY NUMBER\\s(?<advisoryNumber>\\w+))?.*$",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
/**
* Constructor
*/
@ -156,29 +178,86 @@ public final class TPCWatchSrv extends AbstractWatchNotifierSrv {
*/
@Override
public void handleWatch(List<AbstractWarningRecord> warningRecs) {
super.handleWatch(warningRecs);
/*
* Since all records originate from a single TCV product the issuing
* office and record type will be the same we only need to look at the
* first record.
*/
AbstractWarningRecord record = warningRecs.get(0);
String pil = record.getPil();
boolean practiceMode = (record instanceof PracticeWarningRecord);
String issuingOffice = record.getOfficeid();
// if it's a TCV
if ("TCV".equals(pil)) {
super.handleWatch(warningRecs);
}
// if we are not in practice mode
if (!practiceMode) {
// if xxxId ends with a digit (i.e. its a national TCV)
String xxxId = record.getXxxid();
if (Character.isDigit(xxxId.charAt(xxxId.length() - 1))) {
// build the full 9-letter PIL
String fullPil = SiteMap.getInstance().mapICAOToCCC(
issuingOffice)
+ pil + xxxId;
// build the command line for the NWRWAVES script
final String command = NWRWAVES_SCRIPT + fullPil;
// Create a separate thread to run the script
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
RunProcess proc;
try {
proc = RunProcess.getRunProcess().exec(command);
} catch (IOException e) {
statusHandler
.error("Error executing " + command, e);
return;
}
int exitCode = proc.waitFor();
if (exitCode != 0) {
statusHandler.error(command
+ " terminated abnormally with exit code: "
+ exitCode);
}
}
});
thread.start();
}
}
// update TCV Advisories
for (String siteId : getActiveSites()) {
String site4 = SiteMap.getInstance().getSite4LetterId(siteId);
if (issuingOffice.equals(site4)) {
this.saveTCVAdvisories(siteId, practiceMode);
// if TCV save the pending.json files
if ("TCV".equals(pil)) {
this.saveTCVAdvisories(siteId, pil, practiceMode);
}
// if HLS then delete the advisory files if the watch is
// canceled
else if ("HLS".equals(pil)) {
this.deleteTCVAdvisoriesIfCanceled(siteId, pil,
practiceMode, record.getRawmessage());
}
break; // found matching officeId so we're done
}
}
}
private void saveTCVAdvisories(String siteId, boolean practiceMode) {
File advisoriesDirectory = this.synchronizeTCVAdvisories(siteId,
practiceMode);
private void saveTCVAdvisories(String siteId, String pil,
boolean practiceMode) {
this.synchronizeTCVAdvisories(siteId, practiceMode);
String pendingFilename = "pending.json";
LocalizationFile pendingFile = this.getLocalizationFile(siteId,
@ -209,12 +288,64 @@ public final class TPCWatchSrv extends AbstractWatchNotifierSrv {
}
if (transmittedFileSaved) {
boolean allCAN = (Boolean) pendingDict.get("AllCAN");
if (allCAN) {
for (File advisory : advisoriesDirectory
.listFiles(FilenameFilters.byFileExtension(".json"))) {
String advisoryName = advisory.getName();
if (advisoryName.startsWith(stormName)) {
try {
pendingFile.delete();
} catch (LocalizationOpFailedException e) {
statusHandler.error("Unable to delete " + pendingFile, e);
}
// if not practice mode
if (!practiceMode) {
// send TCV files to VTEC partner sites
sendTCVFiles(siteId);
}
}
}
private void deleteTCVAdvisoriesIfCanceled(String siteId, String pil,
boolean practiceMode, String productText) {
File advisoriesDirectory = this.synchronizeTCVAdvisories(siteId,
practiceMode);
Matcher matcher = mndPattern.matcher(productText);
if (matcher.find()) {
String stormName = matcher.group("stormName");
// get the list of json files for this storm
List<String> jsonFiles = new ArrayList<String>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(
advisoriesDirectory.toPath(), stormName + "*.json")) {
for (Path path : stream) {
jsonFiles.add(path.getFileName().toString());
}
} catch (IOException e) {
statusHandler.error(
"Unable to get list of json files for storm: "
+ stormName, e);
}
if (!jsonFiles.isEmpty()) {
// load the highest numbered file for this storm
Collections.sort(jsonFiles, Collections.reverseOrder());
LocalizationFile advFile = this.getLocalizationFile(siteId,
jsonFiles.get(0), practiceMode);
Map<String, Object> advDict = loadJSONDictionary(advFile);
boolean allCAN = (Boolean) advDict.get("AllCAN");
if (allCAN) {
// create a flag file to indicate AllCAN has occurred
File tcvDir = advFile.getFile().getParentFile();
File allCanFile = new File(FileUtil.join(
tcvDir.getAbsolutePath(), stormName + ".allCAN"));
try {
allCanFile.createNewFile();
} catch (IOException e) {
statusHandler.error("Unable to create file: "
+ allCanFile.getAbsolutePath(), e);
}
for (String advisoryName : jsonFiles) {
LocalizationFile advisoryFile = this
.getLocalizationFile(siteId, advisoryName,
practiceMode);
@ -225,13 +356,54 @@ public final class TPCWatchSrv extends AbstractWatchNotifierSrv {
+ advisoryFile, e);
}
}
sendTCVFiles(siteId);
}
}
}
}
private void sendTCVFiles(String siteId) {
IFPServer ifpServer = IFPServer.getActiveServer(siteId);
if (ifpServer == null) {
return;
}
IFPServerConfig config = ifpServer.getConfig();
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext commonBaseCx = pathMgr.getContext(
LocalizationType.COMMON_STATIC, LocalizationLevel.BASE);
String scriptPath = pathMgr.getFile(commonBaseCx,
FileUtil.join(ActiveTablePyIncludeUtil.VTEC, "sendTCV.py"))
.getPath();
String pythonIncludePath = PyUtil.buildJepIncludePath(
ActiveTablePyIncludeUtil.getCommonPythonIncludePath(),
ActiveTablePyIncludeUtil.getCommonGfeIncludePath(),
ActiveTablePyIncludeUtil.getVtecIncludePath(siteId),
ActiveTablePyIncludeUtil.getGfeConfigIncludePath(siteId),
ActiveTablePyIncludeUtil.getIscScriptsIncludePath());
PythonScript script = null;
try {
script = new PythonScript(scriptPath, pythonIncludePath, this
.getClass().getClassLoader());
try {
pendingFile.delete();
} catch (LocalizationOpFailedException e) {
Map<String, Object> argMap = new HashMap<String, Object>();
argMap.put("siteID", siteId);
argMap.put("config", config);
script.execute("runFromJava", argMap);
} catch (JepException e) {
statusHandler.handle(Priority.PROBLEM,
"Error executing sendTCV.", e);
}
script.dispose();
} catch (JepException e) {
statusHandler.handle(Priority.PROBLEM,
"Unable to instantiate sendTCV python script object.", e);
}
}

View file

@ -21,7 +21,7 @@
<constraint constraintValue="warning,practicewarning" constraintType="IN"/>
</mapping>
<mapping key="pil">
<constraint constraintValue="TCV" constraintType="EQUALS"/>
<constraint constraintValue="TCV,HLS" constraintType="IN"/>
</mapping>
</metadataMap>
</pluginNotification>

View file

@ -25,22 +25,22 @@
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 11/10/14 randerso Initial Creation.
# 11/10/2014 randerso Initial Creation.
# 12/08/2014 #4953 randerso Updated for changes to LocalizationSupport
##
import json
import LocalizationSupport
import JUtil
def loadFromJson(localizationType, siteID, fileName):
jsonString = LocalizationSupport.readFile(localizationType, siteID, fileName)
jsonString = LocalizationSupport.readFile(localizationType, LocalizationSupport.SITE, siteID, fileName)
object = json.loads(jsonString)
return object
def saveToJson(localizationType, siteID, fileName, object):
jsonString = json.dumps(object, sort_keys=True,
indent=4, separators=(',', ': '))
LocalizationSupport.writeFile(localizationType, siteID, fileName, jsonString)
LocalizationSupport.writeFile(localizationType, LocalizationSupport.SITE, siteID, fileName, jsonString)
def loadJsonFromJava(localizationType, siteID, fileName):
object = loadFromJson(localizationType, siteID, fileName)

View file

@ -24,33 +24,50 @@
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 11/10/14 randerso Initial Creation.
# 11/10/2014 randerso Initial Creation.
# 12/08/2014 #4953 randerso Made for generic allowing specification of LocalizationLevel
# Re-exported Java enums for easier use.
##
from LockingFile import File
from com.raytheon.uf.common.localization import PathManagerFactory
from com.raytheon.uf.common.localization import LocalizationContext_LocalizationType as LocalizationType
from com.raytheon.uf.common.localization import LocalizationContext_LocalizationLevel as LocalizationLevel
def __getLocalizationFile(loctype, site, filename):
EDEX_STATIC = LocalizationType.EDEX_STATIC
CAVE_STATIC = LocalizationType.CAVE_STATIC
CAVE_CONFIG = LocalizationType.CAVE_CONFIG
COMMON_STATIC = LocalizationType.COMMON_STATIC
BASE = LocalizationLevel.BASE
REGION = LocalizationLevel.REGION
CONFIGURED = LocalizationLevel.CONFIGURED
SITE = LocalizationLevel.SITE
WORKSTATION = LocalizationLevel.WORKSTATION
USER = LocalizationLevel.USER
def getLocalizationFile(loctype, loclevel, contextname, filename):
pathManager = PathManagerFactory.getPathManager()
context = pathManager.getContextForSite(loctype, site)
context = pathManager.getContext(loctype, loclevel)
context.setContextName(contextname)
localizationFile = pathManager.getLocalizationFile(context, filename)
return localizationFile
def readFile(loctype, site, filename):
localizationFile = __getLocalizationFile(loctype, site, filename)
def readFile(loctype, loclevel, contextname, filename):
localizationFile = getLocalizationFile(loctype, loclevel, contextname, filename)
with File(localizationFile.getFile(), filename, 'r') as pythonFile:
fileContents = pythonFile.read()
return fileContents
def writeFile(loctype, site, filename, contents):
localizationFile = __getLocalizationFile(loctype, site, filename)
def writeFile(loctype, loclevel, contextname, filename, contents):
localizationFile = getLocalizationFile(loctype, loclevel, contextname, filename)
with File(localizationFile.getFile(), filename, 'w') as pythonFile:
pythonFile.write(contents)
localizationFile.save()
def deleteFile(loctype, site, filename):
localizationFile = __getLocalizationFile(loctype, site, filename)
def deleteFile(loctype, loclevel, contextname, filename):
localizationFile = getLocalizationFile(loctype, loclevel, contextname, filename)
localizationFile.delete()

View file

@ -1,26 +1,26 @@
##
# 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
# 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
#
# 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.
##
# doConfig - validate and convert serverConfig into simple Java objects
#
# this file was originally config.py
# it was renamed to avoid a conflict with jep's built-in config module
# this file was originally config.py
# it was renamed to avoid a conflict with jep's built-in config module
#
# ----------------------------------------------------------------------------
#
@ -35,37 +35,37 @@
# 11/18/2014 #4953 randerso Added check for empty unit string
#
########################################################################
import types
from java.util import ArrayList,LinkedHashMap
from java.lang import Integer,Float
from com.vividsolutions.jts.geom import Coordinate
from java.awt import Point
Databases = {}
Projections = {}
DiscreteDef = LinkedHashMap() #from parseKeys()
# Check a python sequence to see that
# it matches the format.
# data: is a sequence of objects
# fmt : is a parallel sequence of type objects
# message : optional message to print on exception
#
# Returns data.
# If len(data) != len(fmt)
# or the type of each element in data does not
# match the coresponding type in fmt, then
# a TypeError is raised.
# Example: a, b = check(([1, 3], "foo"), (list, str))
def check(data, fmt, message, allData = None):
if len(data) != len(fmt):
m = message + ": Wrong number of items found, " + \
"Expected " + `len(fmt)` + ", got " + `len(data)` + \
" Input: " + `data`
if allData is not None:
m = m + ' All: ' + `allData`
raise AssertionError, m
import types
from java.util import ArrayList,LinkedHashMap
from java.lang import Integer,Float
from com.vividsolutions.jts.geom import Coordinate
from java.awt import Point
Databases = {}
Projections = {}
DiscreteDef = LinkedHashMap() #from parseKeys()
# Check a python sequence to see that
# it matches the format.
# data: is a sequence of objects
# fmt : is a parallel sequence of type objects
# message : optional message to print on exception
#
# Returns data.
# If len(data) != len(fmt)
# or the type of each element in data does not
# match the coresponding type in fmt, then
# a TypeError is raised.
# Example: a, b = check(([1, 3], "foo"), (list, str))
def check(data, fmt, message, allData = None):
if len(data) != len(fmt):
m = message + ": Wrong number of items found, " + \
"Expected " + `len(fmt)` + ", got " + `len(data)` + \
" Input: " + `data`
if allData is not None:
m = m + ' All: ' + `allData`
raise AssertionError, m
for i in xrange(len(data)):
obj = data[i]
if hasattr(obj, "jclassname"):
@ -73,328 +73,328 @@ def check(data, fmt, message, allData = None):
else:
t = type(obj)
if t != fmt[i]:
m = message + ": Wrong data type found, " + \
"Expected " + `fmt[i]` + ", got " + `t` + \
" for position #" + `i+1` + " Input: " + `data`
if allData is not None:
m = m + ' All: ' + `allData`
raise AssertionError, m
return data
# dictionary check, keys are strings, values/subvalues as specified
def dictCheck(dictionary, value, subvalue, configName):
map = LinkedHashMap()
if type(dictionary) == dict:
for k in dictionary.keys():
if type(k) != str:
raise TypeError, configName + " key [" + `k` + "] not a str"
l = dictionary[k]
if type(l) != value:
raise TypeError, configName + " value [" + `l` + "] not a " \
+ `value`
if value == list or value == tuple:
n = ArrayList()
for m in l:
if type(m) != subvalue:
raise TypeError, configName + " value [" + `l` \
+ "] isn't a " + `subvalue` + ": " + `m`
elif subvalue == int:
n.add(Integer(m))
elif subvalue == float:
n.add(Float(m))
else:
n.add(m)
map.put(k, n)
else:
if value == int:
map.put(k,Integer(l))
elif value == float:
map.put(k,Float(l))
else:
map.put(k, l)
else:
raise TypeError, configName + " not a dict:" + `dictionary`
return map
def getWx(wxtypes, wxvisibilities):
from com.raytheon.uf.common.dataplugin.gfe.weather import WeatherCoverage, WeatherIntensity, WeatherAttribute
from com.raytheon.edex.plugin.gfe.config import SimpleWeatherTypeConfig
types = ArrayList()
for t in wxtypes:
symbol, description, cov, inten, attr = \
check(t, (str, str, list, list, list), "Error in WeatherType")
coverages = ArrayList()
intensities = ArrayList()
attributes = ArrayList()
for c in cov:
csym, cdes = check(c, (str, str), "Error in Weather Coverage", t)
coverages.add(WeatherCoverage(csym, cdes))
for i in inten:
isym, ides = check(i, (str, str), "Error in Weather Intensity", t)
intensities.add(WeatherIntensity(isym, ides))
for a in attr:
asym, ades = check(a, (str, str), "Error in Weather Attributes", t)
attributes.add(WeatherAttribute(asym, ades))
types.add(SimpleWeatherTypeConfig(symbol, description, coverages,
intensities, attributes))
vis = ArrayList()
for v in wxvisibilities:
vis.add(v)
return (vis, types)
#note that DiscreteDef is a dictionary that contains the following
#coded strings: ['OVERLAPS', 'AuxLength', sym1, des1, sym2, des2, ....]
#We do this to pass to C++ as a InitDict, which
#is a Dict<TextString, SeqOf<TextString>.
def parseKeys(name, overlaps, auxLength, keys):
if not DiscreteDef.containsKey(name):
ts = ArrayList()
if overlaps:
ts.add("OVERLAPS")
else:
ts.add("MUTEXC")
ts.add(`auxLength`)
for symdes in keys:
sym, des = check(symdes, (str, str),
"Error in DiscreteKey Definition", keys)
ts.add(sym)
ts.add(des)
if overlaps and len(keys) > 0 and keys[0][0] != "<None>":
s = "1st discrete key must be <None> for OVERLAP-defined " +\
"weather element. [" + name + "]" + `keys`
raise Exception, s
DiscreteDef.put(name, ts);
def createParm(parminfo, domain, tc):
from com.raytheon.edex.plugin.gfe.config import SimpleGridParmConfig
m = "Format Error in Weather Element Definition"
if len(parminfo) < 2:
raise TypeError, m + ': ' + `parminfo`
dim, origin, extent, timezone, projection,officeType = domain
if parminfo[1] == 'Scalar' or parminfo[1] == 'Vector':
parmInfoFmt = (str, str, str, str, float, float, int, int)
name, type, units, description, max, min, precision, \
rateParm = check(parminfo, parmInfoFmt, m)
elif parminfo[1] == 'Weather':
name, type, units, description = \
check(parminfo, (str, str, str, str), m)
max = 0
min = 0
precision = 0
rateParm = False
elif parminfo[1] == 'Discrete':
if len(parminfo) == 6:
parmInfoFmt = (str, str, str, str, int, list)
name, type, units, description, overlaps, keys = \
check(parminfo, parmInfoFmt, m)
auxSize = 0
else:
parmInfoFmt = (str, str, str, str, int, list, int)
name, type, units, description, overlaps, keys, auxSize = \
check(parminfo, parmInfoFmt, m)
max = 0.0
min = 0.0
precision = 0
rateParm = False
parseKeys(name, overlaps, auxSize, keys)
else:
raise Exception, "Illegal WE type specified for " + `parminfo[0]`
#don't add parms with your own office type in the name.
if name.find(officeType) != -1:
if t != fmt[i]:
m = message + ": Wrong data type found, " + \
"Expected " + `fmt[i]` + ", got " + `t` + \
" for position #" + `i+1` + " Input: " + `data`
if allData is not None:
m = m + ' All: ' + `allData`
raise AssertionError, m
return data
# dictionary check, keys are strings, values/subvalues as specified
def dictCheck(dictionary, value, subvalue, configName):
map = LinkedHashMap()
if type(dictionary) == dict:
for k in dictionary.keys():
if type(k) != str:
raise TypeError, configName + " key [" + `k` + "] not a str"
l = dictionary[k]
if type(l) != value:
raise TypeError, configName + " value [" + `l` + "] not a " \
+ `value`
if value == list or value == tuple:
n = ArrayList()
for m in l:
if type(m) != subvalue:
raise TypeError, configName + " value [" + `l` \
+ "] isn't a " + `subvalue` + ": " + `m`
elif subvalue == int:
n.add(Integer(m))
elif subvalue == float:
n.add(Float(m))
else:
n.add(m)
map.put(k, n)
else:
if value == int:
map.put(k,Integer(l))
elif value == float:
map.put(k,Float(l))
else:
map.put(k, l)
else:
raise TypeError, configName + " not a dict:" + `dictionary`
return map
def getWx(wxtypes, wxvisibilities):
from com.raytheon.uf.common.dataplugin.gfe.weather import WeatherCoverage, WeatherIntensity, WeatherAttribute
from com.raytheon.edex.plugin.gfe.config import SimpleWeatherTypeConfig
types = ArrayList()
for t in wxtypes:
symbol, description, cov, inten, attr = \
check(t, (str, str, list, list, list), "Error in WeatherType")
coverages = ArrayList()
intensities = ArrayList()
attributes = ArrayList()
for c in cov:
csym, cdes = check(c, (str, str), "Error in Weather Coverage", t)
coverages.add(WeatherCoverage(csym, cdes))
for i in inten:
isym, ides = check(i, (str, str), "Error in Weather Intensity", t)
intensities.add(WeatherIntensity(isym, ides))
for a in attr:
asym, ades = check(a, (str, str), "Error in Weather Attributes", t)
attributes.add(WeatherAttribute(asym, ades))
types.add(SimpleWeatherTypeConfig(symbol, description, coverages,
intensities, attributes))
vis = ArrayList()
for v in wxvisibilities:
vis.add(v)
return (vis, types)
#note that DiscreteDef is a dictionary that contains the following
#coded strings: ['OVERLAPS', 'AuxLength', sym1, des1, sym2, des2, ....]
#We do this to pass to C++ as a InitDict, which
#is a Dict<TextString, SeqOf<TextString>.
def parseKeys(name, overlaps, auxLength, keys):
if not DiscreteDef.containsKey(name):
ts = ArrayList()
if overlaps:
ts.add("OVERLAPS")
else:
ts.add("MUTEXC")
ts.add(`auxLength`)
for symdes in keys:
sym, des = check(symdes, (str, str),
"Error in DiscreteKey Definition", keys)
ts.add(sym)
ts.add(des)
if overlaps and len(keys) > 0 and keys[0][0] != "<None>":
s = "1st discrete key must be <None> for OVERLAP-defined " +\
"weather element. [" + name + "]" + `keys`
raise Exception, s
DiscreteDef.put(name, ts);
def createParm(parminfo, domain, tc):
from com.raytheon.edex.plugin.gfe.config import SimpleGridParmConfig
m = "Format Error in Weather Element Definition"
if len(parminfo) < 2:
raise TypeError, m + ': ' + `parminfo`
dim, origin, extent, timezone, projection,officeType = domain
if parminfo[1] == 'Scalar' or parminfo[1] == 'Vector':
parmInfoFmt = (str, str, str, str, float, float, int, int)
name, type, units, description, max, min, precision, \
rateParm = check(parminfo, parmInfoFmt, m)
elif parminfo[1] == 'Weather':
name, type, units, description = \
check(parminfo, (str, str, str, str), m)
max = 0
min = 0
precision = 0
rateParm = False
elif parminfo[1] == 'Discrete':
if len(parminfo) == 6:
parmInfoFmt = (str, str, str, str, int, list)
name, type, units, description, overlaps, keys = \
check(parminfo, parmInfoFmt, m)
auxSize = 0
else:
parmInfoFmt = (str, str, str, str, int, list, int)
name, type, units, description, overlaps, keys, auxSize = \
check(parminfo, parmInfoFmt, m)
max = 0.0
min = 0.0
precision = 0
rateParm = False
parseKeys(name, overlaps, auxSize, keys)
else:
raise Exception, "Illegal WE type specified for " + `parminfo[0]`
#don't add parms with your own office type in the name.
if name.find(officeType) != -1:
return None #skip this one
if len(units) == 0:
raise Exception, 'Unit string must not be empty. For unitless quantities enter "1"'
updateProjections(projection)
start, repeat, duration = tc
timeIndependentParm = (repeat == 0 and duration == 0)
# return WeatherElement(name, type, units, description, max, min,
# precision, timeIndependentParm, dim, origin,
# extent, start, repeat, duration, rateParm)
return SimpleGridParmConfig(name, type, units, description, 1.0*max, 1.0*min,
precision, timeIndependentParm, Point(dim[0], dim[1]), Coordinate(origin[0], origin[1]),
Coordinate(extent[0], extent[1]), start, repeat, duration, rateParm)
def getDB(site, projID, dbinfo):
from com.raytheon.edex.plugin.gfe.config import SimpleModelConfig
dbinfoFmt = (str, str, str, int, int, int, int)
name, format, type, single, official, numVer, purgeAge = \
check(dbinfo, dbinfoFmt, "Error in Database Attribute Definition")
if not Databases.has_key(name+type):
Databases[name+type] = SimpleModelConfig(site, format, type, name, projID,
single, official, numVer, purgeAge)
return Databases[name+type]
def parseDBItm(site, domain, item):
# import serverConfig
# domain = serverConfig.SITES[site]
dbinfo, parminfo = check(item, (tuple, list),
"Database Definition or Parm Group Format Error")
projID = domain[4][0]
db = getDB(site, projID, dbinfo)
grids = db.grids
for ptc in parminfo:
parms, tc = check(ptc, (list, tuple),
"Parm Group/Time Constraint Tuple Error")
check(tc, (int, int, int), "Time Constraint Format Error", ptc)
for parm in parms:
grids.add(createParm(parm, domain, tc))
db.grids = grids
def updateProjections(projection):
from com.raytheon.uf.common.dataplugin.gfe.config import ProjectionData
# extract projection data
raise Exception, 'Unit string must not be empty. For unitless quantities enter "1"'
updateProjections(projection)
start, repeat, duration = tc
timeIndependentParm = (repeat == 0 and duration == 0)
# return WeatherElement(name, type, units, description, max, min,
# precision, timeIndependentParm, dim, origin,
# extent, start, repeat, duration, rateParm)
return SimpleGridParmConfig(name, type, units, description, 1.0*max, 1.0*min,
precision, timeIndependentParm, Point(dim[0], dim[1]), Coordinate(origin[0], origin[1]),
Coordinate(extent[0], extent[1]), start, repeat, duration, rateParm)
def getDB(site, projID, dbinfo):
from com.raytheon.edex.plugin.gfe.config import SimpleModelConfig
dbinfoFmt = (str, str, str, int, int, int, int)
name, format, type, single, official, numVer, purgeAge = \
check(dbinfo, dbinfoFmt, "Error in Database Attribute Definition")
if not Databases.has_key(name+type):
Databases[name+type] = SimpleModelConfig(site, format, type, name, projID,
single, official, numVer, purgeAge)
return Databases[name+type]
def parseDBItm(site, domain, item):
# import serverConfig
# domain = serverConfig.SITES[site]
dbinfo, parminfo = check(item, (tuple, list),
"Database Definition or Parm Group Format Error")
projID = domain[4][0]
db = getDB(site, projID, dbinfo)
grids = db.grids
for ptc in parminfo:
parms, tc = check(ptc, (list, tuple),
"Parm Group/Time Constraint Tuple Error")
check(tc, (int, int, int), "Time Constraint Format Error", ptc)
for parm in parms:
grids.add(createParm(parm, domain, tc))
db.grids = grids
def updateProjections(projection):
from com.raytheon.uf.common.dataplugin.gfe.config import ProjectionData
# extract projection data
projFmt = (str,
"com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData$ProjectionType",
tuple, tuple, tuple, float, float, tuple, tuple, float, float, float)
projID, ptype, pllll, pllur, pllo, pspo, pspt, pgpll, pgpur, pli, \
plc, plo = check(projection, projFmt, "Format error in Projection")
check(pllll, (float, float),
"Format error lower left long/lat in Projection", projection)
check(pllur, (float, float),
"Format error upper right long/lat in Projection", projection)
check(pllo, (float, float),
"Format error long/lat origin in Projection", projection)
check(pgpll, (int, int),
"Format error lower left grid point in Projection", projection)
check(pgpur, (int, int),
"Format error upper right grid point in Projection", projection)
if not Projections.has_key(projID):
Projections[projID] = ProjectionData(projID, ptype,
Coordinate(pllll[0],pllll[1]),
Coordinate(pllur[0],pllur[1]),
Coordinate(pllo[0],pllo[1]),
pspo, pspt,
Point(pgpll[0], pgpll[1]),
Point(pgpur[0], pgpur[1]),
pli, plc, plo)
def parseGridLocation(domain):
from com.raytheon.edex.plugin.gfe.config import SimpleGridLocation
#if office type is present:
if len(domain) == 6:
domainFmt = (list,tuple,tuple,str,tuple,str)
gridSize, origin, extent, tz, proj, officeType = check(domain, domainFmt, "Format error in SITES line")
#if office type is not present:
else:
domainFmt = (list, tuple, tuple, str, tuple)
gridSize, origin, extent, tz, proj = check(domain, domainFmt,
"Format error in SITES line")
check(gridSize, (int, int), "GridSize format error from SITES", domain)
check(origin, (float, float), "Origin format error from SITES", domain)
check(extent, (float, float), "Extent format error from SITES", domain)
tuple, tuple, tuple, float, float, tuple, tuple, float, float, float)
projID, ptype, pllll, pllur, pllo, pspo, pspt, pgpll, pgpur, pli, \
plc, plo = check(projection, projFmt, "Format error in Projection")
check(pllll, (float, float),
"Format error lower left long/lat in Projection", projection)
check(pllur, (float, float),
"Format error upper right long/lat in Projection", projection)
check(pllo, (float, float),
"Format error long/lat origin in Projection", projection)
check(pgpll, (int, int),
"Format error lower left grid point in Projection", projection)
check(pgpur, (int, int),
"Format error upper right grid point in Projection", projection)
if not Projections.has_key(projID):
Projections[projID] = ProjectionData(projID, ptype,
Coordinate(pllll[0],pllll[1]),
Coordinate(pllur[0],pllur[1]),
Coordinate(pllo[0],pllo[1]),
pspo, pspt,
Point(pgpll[0], pgpll[1]),
Point(pgpur[0], pgpur[1]),
pli, plc, plo)
def parseGridLocation(domain):
from com.raytheon.edex.plugin.gfe.config import SimpleGridLocation
#if office type is present:
if len(domain) == 6:
domainFmt = (list,tuple,tuple,str,tuple,str)
gridSize, origin, extent, tz, proj, officeType = check(domain, domainFmt, "Format error in SITES line")
#if office type is not present:
else:
domainFmt = (list, tuple, tuple, str, tuple)
gridSize, origin, extent, tz, proj = check(domain, domainFmt,
"Format error in SITES line")
check(gridSize, (int, int), "GridSize format error from SITES", domain)
check(origin, (float, float), "Origin format error from SITES", domain)
check(extent, (float, float), "Extent format error from SITES", domain)
projFmt = (str,
"com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData$ProjectionType",
tuple, tuple, tuple, float, float, tuple, tuple, float, float, float)
projID, projType, llll, llur, llo, sp1, sp2, gpll, gpur, li, lc, lo = \
check(proj, projFmt, "Format error in Projection")
check(llll, (float, float),
"Format error lower left long/lat in Projection", proj)
check(llur, (float, float),
"Format error upper right long/lat in Projection", proj)
check(llo, (float, float),
"Format error long/lat origin in Projection", proj)
check(gpll, (int, int),
"Format error lower left grid point in Projection", proj)
check(gpur, (int, int),
"Format error upper right grid point in Projection", proj)
gloc = SimpleGridLocation(Point(gridSize[0], gridSize[1]),
Coordinate(origin[0], origin[1]),
Coordinate(extent[0], extent[1]),
projID, projType,
Coordinate(llll[0], llll[1]),
Coordinate(llur[0], llur[1]),
Coordinate(llo[0], llo[1]),
sp1, sp2,
Point(gpll[0], gpll[1]),
Point(gpur[0], gpur[1]),
li, lc, lo)
return gloc
def parse(site, databases, wxtypes, wxvisibilities, allSites, inProjections):
from com.raytheon.edex.plugin.gfe.config import SimpleGridLocation
domain = parseGridLocation(allSites[site])
for itm in databases:
parseDBItm(site, allSites[site], itm)
if type(wxtypes) != list:
raise TypeError, "Format Error in WeatherTypes, not a list: " \
+ `wxtypes`
if type(wxvisibilities) != list:
raise TypeError, "Format Error in visibilities, not a list: " \
+ `wxvisibilities`
vis, types = getWx(wxtypes, wxvisibilities)
models = ArrayList()
for key in Databases.keys():
models.add(Databases[key])
projections = ArrayList()
if type(inProjections) != list:
raise TypeError, "Format Error in Projections, not a list: " \
+ `inProjections`
for p in inProjections:
updateProjections(p)
for key in Projections.keys():
projections.add(Projections[key])
allSiteIDs = ArrayList()
allOfficeTypes = ArrayList()
for key in allSites.keys():
allSiteIDs.add(key)
try:
ot = allSites[key][5]
if type(ot) != str:
raise TypeError, "Format Error in office type, not a str:",allSites[key]
except:
ot = "wfo" #assumes wfo if not present
allOfficeTypes.add(ot)
siteId = ArrayList()
siteId.add(site)
timeZone = ArrayList()
timeZone.add(allSites[site][3])
return models, projections, vis, types, DiscreteDef, allSiteIDs, domain, siteId, timeZone, allOfficeTypes
def d2dParse(d2dmodels):
dict = LinkedHashMap()
for entry in d2dmodels:
if type(entry) is types.TupleType:
d2dModelName, gfeModelName = check(entry, (str, str),
"Format error in D2DMODELS entry", d2dmodels)
dict.put(d2dModelName, gfeModelName)
elif type(entry) is types.StringType:
d2dModelName = entry
dict.put(d2dModelName, d2dModelName)
else:
raise SyntaxError, "Invalid syntax for D2DMODELS" + `d2dmodels`
return dict
tuple, tuple, tuple, float, float, tuple, tuple, float, float, float)
projID, projType, llll, llur, llo, sp1, sp2, gpll, gpur, li, lc, lo = \
check(proj, projFmt, "Format error in Projection")
check(llll, (float, float),
"Format error lower left long/lat in Projection", proj)
check(llur, (float, float),
"Format error upper right long/lat in Projection", proj)
check(llo, (float, float),
"Format error long/lat origin in Projection", proj)
check(gpll, (int, int),
"Format error lower left grid point in Projection", proj)
check(gpur, (int, int),
"Format error upper right grid point in Projection", proj)
gloc = SimpleGridLocation(Point(gridSize[0], gridSize[1]),
Coordinate(origin[0], origin[1]),
Coordinate(extent[0], extent[1]),
projID, projType,
Coordinate(llll[0], llll[1]),
Coordinate(llur[0], llur[1]),
Coordinate(llo[0], llo[1]),
sp1, sp2,
Point(gpll[0], gpll[1]),
Point(gpur[0], gpur[1]),
li, lc, lo)
return gloc
def parse(site, databases, wxtypes, wxvisibilities, allSites, inProjections):
from com.raytheon.edex.plugin.gfe.config import SimpleGridLocation
domain = parseGridLocation(allSites[site])
for itm in databases:
parseDBItm(site, allSites[site], itm)
if type(wxtypes) != list:
raise TypeError, "Format Error in WeatherTypes, not a list: " \
+ `wxtypes`
if type(wxvisibilities) != list:
raise TypeError, "Format Error in visibilities, not a list: " \
+ `wxvisibilities`
vis, types = getWx(wxtypes, wxvisibilities)
models = ArrayList()
for key in Databases.keys():
models.add(Databases[key])
projections = ArrayList()
if type(inProjections) != list:
raise TypeError, "Format Error in Projections, not a list: " \
+ `inProjections`
for p in inProjections:
updateProjections(p)
for key in Projections.keys():
projections.add(Projections[key])
allSiteIDs = ArrayList()
allOfficeTypes = ArrayList()
for key in allSites.keys():
allSiteIDs.add(key)
try:
ot = allSites[key][5]
if type(ot) != str:
raise TypeError, "Format Error in office type, not a str:",allSites[key]
except:
ot = "wfo" #assumes wfo if not present
allOfficeTypes.add(ot)
siteId = ArrayList()
siteId.add(site)
timeZone = ArrayList()
timeZone.add(allSites[site][3])
return models, projections, vis, types, DiscreteDef, allSiteIDs, domain, siteId, timeZone, allOfficeTypes
def d2dParse(d2dmodels):
dict = LinkedHashMap()
for entry in d2dmodels:
if type(entry) is types.TupleType:
d2dModelName, gfeModelName = check(entry, (str, str),
"Format error in D2DMODELS entry", d2dmodels)
dict.put(d2dModelName, gfeModelName)
elif type(entry) is types.StringType:
d2dModelName = entry
dict.put(d2dModelName, d2dModelName)
else:
raise SyntaxError, "Invalid syntax for D2DMODELS" + `d2dmodels`
return dict
def netcdfParse(netcdfDirs):
dict = LinkedHashMap()
@ -417,139 +417,107 @@ def netcdfParse(netcdfDirs):
raise SyntaxError, "Invalid syntax for NETCDFDIRS" + `netcdfDirs`
return dict
def parseSat(satdata):
rval = LinkedHashMap()
for e in satdata:
if type(e) is types.TupleType:
direct, name = check(e, (str, str),
"Format error in SATDATA entry", satdata)
rval.put(direct, name)
else:
raise SyntaxError, "Invalid syntax for SATDATA" + `satdata`
return rval
def otherParse(serverhost, mhsid, port,
initmodules, accumElem,
initskips, d2ddbver, logfilepurge, prddir, home,
extraWEPrec, vtecRequestTime, autoConfigureNotifyTextProd,
iscRoutingTableAddress, requestedISCsites, requestISC, sendiscOnSave,
sendiscOnPublish, requestedISCparms, transmitScript):
if type(serverhost) != str:
raise TypeError, "GFESUITE_HOST not an str: " + `serverhost`
if type(mhsid) != str:
raise TypeError, "GFESUITE_MHSID not an str: " + `mhsid`
def parseSat(satdata):
rval = LinkedHashMap()
for e in satdata:
if type(e) is types.TupleType:
direct, name = check(e, (str, str),
"Format error in SATDATA entry", satdata)
rval.put(direct, name)
else:
raise SyntaxError, "Invalid syntax for SATDATA" + `satdata`
return rval
def otherParse(serverhost, mhsid, port,
initmodules, accumElem,
initskips, d2ddbver, logfilepurge, prddir, home,
extraWEPrec, vtecRequestTime, autoConfigureNotifyTextProd,
iscRoutingTableAddress, requestedISCsites, requestISC, sendiscOnSave,
sendiscOnPublish, requestedISCparms, transmitScript):
if type(serverhost) != str:
raise TypeError, "GFESUITE_HOST not an str: " + `serverhost`
if type(mhsid) != str:
raise TypeError, "GFESUITE_MHSID not an str: " + `mhsid`
if type(vtecRequestTime) != int:
raise TypeError, "VTECPartners: VTEC_REMOTE_TABLE_FETCH_TIME " + \
"not an int: " + `vtecRequestTime`
if type(port) != int:
raise TypeError, "GFESUITE_PORT not an int: " + `port`
javainitmodules = dictCheck(initmodules, list, str, "INITMODULES")
accumElem = dictCheck(accumElem, list, str, "D2DAccumulativeElements")
initskips = dictCheck(initskips, list, int, "INITSKIPS")
d2ddbver = dictCheck(d2ddbver, int, None, "D2DDBVERSIONS")
if type(logfilepurge) != int:
raise TypeError, "LOG_FILE_PURGE_AFTER not an int: " + `logfilepurge`
if type(autoConfigureNotifyTextProd) != int:
raise TypeError, "AUTO_CONFIGURE_NOTIFYTEXTPROD not an int: " + \
`logfilepurge`
if type(prddir) != str:
raise TypeError, "GFESUITE_PRDDIR not an str: " + `prddir`
if type(home) != str:
raise TypeError, "GFESUITE_HOME not an str: " + `home`
if type(extraWEPrec) != list:
raise TypeError, "ExtraWEPrec not an list: " + `extraWEPrec`
else:
extraWEPrecision = LinkedHashMap()
for e in extraWEPrec:
if type(e) == str:
extraWEPrecision.put(e, Integer(1))
elif type(e) == tuple and len(e) == 2 and type(e[0]) == str and \
type(e[1]) == int:
extraWEPrecision.put(e[0], Integer(e[1]))
else:
raise TypeError, \
"Entry in ExtraWEPrec not str or (str, int): " + `e`
iscRoutingTableAddress = dictCheck(iscRoutingTableAddress,str,str,"ISC_ROUTING_TABLE_ADDRESS")
#if type(iscRoutingTableAddress) not in [str, types.NoneType]:
# raise TypeError, "ISC_ROUTING_TABLE_ADDRESS not None or a str: " + \
# `iscRoutingTableAddress`
#elif iscRoutingTableAddress is None:
# iscRoutingTableAddress = ""
reqISCsites = ArrayList()
if type(requestedISCsites) not in [list, types.NoneType]:
raise TypeError, "REQUESTED_ISC_SITES not None or a list: " + \
`requestedISCsites`
elif type(requestedISCsites) is list:
for r in requestedISCsites:
if type(r) != str:
raise TypeError, "REQUESTED_ISC_SITES not list of strings: " + \
`requestedISCsites`
else:
reqISCsites.add(r);
reqISCparms = ArrayList()
if type(requestedISCparms) not in [list, types.NoneType]:
raise TypeError, "REQUESTED_ISC_PARMS not None or a list: " + \
`requestedISCparms`
elif type(requestedISCparms) is list:
for r in requestedISCparms:
if type(r) != str:
raise TypeError, "REQUESTED_ISC_PARMS not list of strings: " + \
`requestedISCparms`
else:
reqISCparms.add(r)
if type(requestISC) != int:
raise TypeError, "REQUEST_ISC not an int: " + `requestISC`
if type(sendiscOnSave) != int:
raise TypeError, "SEND_ISC_ON_SAVE not an int: " + `sendiscOnSave`
if type(sendiscOnPublish) != int:
raise TypeError, "SEND_ISC_ON_PUBLISH not an int: " + `sendiscOnPublish`
if type(transmitScript) not in [str, types.NoneType]:
raise TypeError, "TRANSMIT_SCRIPT not None or str: " + `transmitScript`
elif transmitScript is None:
transmitScript = ""
# build model to init mapping
modelToInit = {}
for module in initmodules:
for model in initmodules[module]:
if modelToInit.has_key(model):
modelToInit[model].append(module)
"not an int: " + `vtecRequestTime`
if type(port) != int:
raise TypeError, "GFESUITE_PORT not an int: " + `port`
initmodules = dictCheck(initmodules, list, str, "INITMODULES")
accumElem = dictCheck(accumElem, list, str, "D2DAccumulativeElements")
initskips = dictCheck(initskips, list, int, "INITSKIPS")
d2ddbver = dictCheck(d2ddbver, int, None, "D2DDBVERSIONS")
if type(logfilepurge) != int:
raise TypeError, "LOG_FILE_PURGE_AFTER not an int: " + `logfilepurge`
if type(autoConfigureNotifyTextProd) != int:
raise TypeError, "AUTO_CONFIGURE_NOTIFYTEXTPROD not an int: " + \
`logfilepurge`
if type(prddir) != str:
raise TypeError, "GFESUITE_PRDDIR not an str: " + `prddir`
if type(home) != str:
raise TypeError, "GFESUITE_HOME not an str: " + `home`
if type(extraWEPrec) != list:
raise TypeError, "ExtraWEPrec not an list: " + `extraWEPrec`
else:
extraWEPrecision = LinkedHashMap()
for e in extraWEPrec:
if type(e) == str:
extraWEPrecision.put(e, Integer(1))
elif type(e) == tuple and len(e) == 2 and type(e[0]) == str and \
type(e[1]) == int:
extraWEPrecision.put(e[0], Integer(e[1]))
else:
modelToInit[model] = [module]
# check for duplicate init modules
for model in modelToInit:
modules = modelToInit[model]
if len(modules) > 1:
message = "Multiple smartInit modules " + str(modules) + \
" are enabled for D2D model: " + model + ". " + str(modules[1:]) + \
" will be disabled. Please edit your localConfig.py file and disable all but one."
raise TypeError, \
"Entry in ExtraWEPrec not str or (str, int): " + `e`
# log error message to edex log
import LogStream
LogStream.logProblem(message);
# log error to alertViz
from com.raytheon.uf.edex.core import EDEXUtil
from com.raytheon.uf.common.status import UFStatus_Priority as Priority
EDEXUtil.sendMessageAlertViz(Priority.ERROR,
"com.raytheon.edex.plugin.gfe", "GFE", "GFE", message,
message, None)
iscRoutingTableAddress = dictCheck(iscRoutingTableAddress,str,str,"ISC_ROUTING_TABLE_ADDRESS")
#if type(iscRoutingTableAddress) not in [str, types.NoneType]:
# raise TypeError, "ISC_ROUTING_TABLE_ADDRESS not None or a str: " + \
# `iscRoutingTableAddress`
#elif iscRoutingTableAddress is None:
# iscRoutingTableAddress = ""
# remove duplicate
for module in modules[1:]:
javainitmodules.remove(module)
return serverhost, mhsid, \
port, javainitmodules, accumElem, \
initskips, d2ddbver, logfilepurge, prddir, home,\
extraWEPrecision, vtecRequestTime, \
autoConfigureNotifyTextProd, \
iscRoutingTableAddress, reqISCsites, requestISC, sendiscOnSave, \
sendiscOnPublish, reqISCparms, transmitScript
reqISCsites = ArrayList()
if type(requestedISCsites) not in [list, types.NoneType]:
raise TypeError, "REQUESTED_ISC_SITES not None or a list: " + \
`requestedISCsites`
elif type(requestedISCsites) is list:
for r in requestedISCsites:
if type(r) != str:
raise TypeError, "REQUESTED_ISC_SITES not list of strings: " + \
`requestedISCsites`
else:
reqISCsites.add(r);
reqISCparms = ArrayList()
if type(requestedISCparms) not in [list, types.NoneType]:
raise TypeError, "REQUESTED_ISC_PARMS not None or a list: " + \
`requestedISCparms`
elif type(requestedISCparms) is list:
for r in requestedISCparms:
if type(r) != str:
raise TypeError, "REQUESTED_ISC_PARMS not list of strings: " + \
`requestedISCparms`
else:
reqISCparms.add(r)
if type(requestISC) != int:
raise TypeError, "REQUEST_ISC not an int: " + `requestISC`
if type(sendiscOnSave) != int:
raise TypeError, "SEND_ISC_ON_SAVE not an int: " + `sendiscOnSave`
if type(sendiscOnPublish) != int:
raise TypeError, "SEND_ISC_ON_PUBLISH not an int: " + `sendiscOnPublish`
if type(transmitScript) not in [str, types.NoneType]:
raise TypeError, "TRANSMIT_SCRIPT not None or str: " + `transmitScript`
elif transmitScript is None:
transmitScript = ""
return serverhost, mhsid, \
port, initmodules, accumElem, \
initskips, d2ddbver, logfilepurge, prddir, home,\
extraWEPrecision, vtecRequestTime, \
autoConfigureNotifyTextProd, \
iscRoutingTableAddress, reqISCsites, requestISC, sendiscOnSave, \
sendiscOnPublish, reqISCparms, transmitScript

View file

@ -17,6 +17,17 @@
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
#
# Create Area Dictionary
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 12/05/14 4953 randerso Changed to use LocalizationSupport
#
##
import os, string, copy
import tempfile, stat
@ -26,8 +37,7 @@ from fips2cities import *
from zones2cities import *
from LockingFile import File
from com.raytheon.uf.common.localization import PathManagerFactory
from com.raytheon.uf.common.localization import LocalizationContext_LocalizationType as LocalizationType, LocalizationContext_LocalizationLevel as LocalizationLevel
import LocalizationSupport
#
# Creates area dictionary specific to a site. Somewhat ported from AWIPS-I.
@ -447,25 +457,17 @@ def _getZones(siteID):
siteID + ".py"
zonesKey = "Zones_" + siteID
editAreasFileContents = _getFileContents(LocalizationType.CAVE_STATIC,
LocalizationLevel.CONFIGURED,
siteID,
editAreasFilename)
editAreasFileContents = LocalizationSupport.readFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.CONFIGURED,
siteID,
editAreasFilename)
exec(editAreasFileContents)
# EASourceMap comes from the EditAreas file
return EASourceMap[zonesKey]
def _getFileContents(loctype, loclevel, locname, filename):
pathManager = PathManagerFactory.getPathManager()
context = pathManager.getContext(loctype, loclevel)
context.setContextName(locname)
localizationFile = pathManager.getLocalizationFile(context, filename)
with File(localizationFile.getFile(), filename, 'r') as pythonFile:
fileContents = pythonFile.read()
return fileContents
def _formatDictionary(dictionary, tabLevel, output=""):
TAB = " " * 4

View file

@ -24,20 +24,27 @@
#
# Author: mathewson
# ----------------------------------------------------------------------------
##
#
# This class provides interfaces to the ISC Routing Table Web Service.
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 12/10/14 #4953 randerso Cleaned up imports,
# improved spawning of shell cmd
#
##
import xml
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
import socket
import urllib, urllib2, time, os, copy, string
import LogStream,JUtil
import JUtil, iscUtil
from java.util import ArrayList
import LogStream
import JUtil
import iscUtil
class IrtAccess():

View file

@ -20,13 +20,12 @@
import cPickle
import LogStream, tempfile, os, sys, JUtil, subprocess, traceback
import LogStream, tempfile, os, sys, JUtil, subprocess, traceback, errno
import time, copy, string, iscUtil
from com.raytheon.edex.plugin.gfe.isc import IRTManager
#
# Port of IRT functionality from legacy ifpServer
#
@ -46,28 +45,31 @@ from com.raytheon.edex.plugin.gfe.isc import IRTManager
# makeISCrequest().
# 10/16/13 2475 dgilling Remove unneeded code to handle
# registration with IRT.
#
#
# 12/08/2014 4953 randerso Added support for sending/receiving TCV files
# Additional code clean up
#
##
PURGE_AGE = 30 * 24 * 60 * 60 # 30 days in seconds
def getLogger():
import logging
return iscUtil.getLogger("irtServer", logLevel=logging.DEBUG)
def logEvent(*msg):
iscUtil.getLogger("irtServer").info(iscUtil.tupleToString(*msg))
getLogger().info(iscUtil.tupleToString(*msg))
def logProblem(*msg):
iscUtil.getLogger("irtServer").error(iscUtil.tupleToString(*msg))
getLogger().error(iscUtil.tupleToString(*msg))
def logException(*msg):
iscUtil.getLogger("irtServer").exception(iscUtil.tupleToString(*msg))
getLogger().exception(iscUtil.tupleToString(*msg))
def logVerbose(*msg):
iscUtil.getLogger("irtServer").debug(iscUtil.tupleToString(*msg))
def logDebug(*msg):
logVerbose(iscUtil.tupleToString(*msg))
getLogger().debug(iscUtil.tupleToString(*msg))
# called by iscDataRec when another site has requested the active table
# returns the active table, filtered, pickled.
def getVTECActiveTable(siteAndFilterInfo, xmlPacket):
def getVTECActiveTable(dataFile, xmlPacket):
import siteConfig
import VTECPartners
@ -75,7 +77,9 @@ def getVTECActiveTable(siteAndFilterInfo, xmlPacket):
return #respond is disabled
#decode the data (pickled)
info = cPickle.loads(siteAndFilterInfo)
with open(dataFile, "rb") as fp:
info = cPickle.load(fp)
(mhsSite, reqsite, filterSites, countDict, issueTime) = info
#get the active table, and write it to a temporary file
@ -159,8 +163,11 @@ def getVTECActiveTable(siteAndFilterInfo, xmlPacket):
#when we receive a requested active table from another site, this function
#is called from iscDataRec
def putVTECActiveTable(strTable, xmlPacket):
def putVTECActiveTable(dataFile, xmlPacket):
import siteConfig
with open(dataFile, "rb") as fp:
strTable = fp.read()
#write the xmlpacket to a temporary file, if one was passed
inDir = os.path.join(siteConfig.GFESUITE_PRDDIR, "ATBL")
@ -188,6 +195,142 @@ def putVTECActiveTable(strTable, xmlPacket):
logProblem("Error executing ingestAT: ", traceback.format_exc())
logEvent("ingesAT command output: ", output)
def putTCVFiles(siteID, tarFile):
import LocalizationSupport
import glob
import TCVUtil
logEvent("Receiving TCV files from " + siteID)
siteDir = LocalizationSupport.getLocalizationFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.SITE,
siteID, "gfe").getFile()
siteDir = siteDir.getParentFile().getParentFile().getAbsolutePath()
logDebug("siteDir: "+siteDir)
try:
tmpDir = tempfile.mkdtemp(dir="/tmp")
logDebug("tmpDir: "+tmpDir)
subprocess.check_call(["cd " + tmpDir + "; tar xvzf " + tarFile], shell=True)
except:
logException('Error untarring TCV files from site: ' + siteID)
raise
TCVUtil.purgeAllCanFiles(getLogger())
# create the new allCAN files
for tmpFile in glob.iglob(os.path.join(tmpDir, "*/gfe/tcvAdvisories/*.allCAN")):
# create tcvDir if necessary
tcvDir = os.path.dirname(tmpFile).replace(tmpDir, siteDir)
logDebug("tcvDir: "+tcvDir)
try:
os.makedirs(tcvDir, 0755)
except OSError, e:
if e.errno != errno.EEXIST:
logProblem("%s: '%s'" % (e.strerror,e.filename))
basename = os.path.basename(tmpFile)
stormName = basename.replace(".allCAN", "")
allCanPath = os.path.join(tcvDir, basename)
logDebug("copying "+tmpFile+" to "+allCanPath)
try:
# just create the empty allCan file
with open(allCanPath, 'w'):
pass
except:
logException("Error creating: "+ allCanPath)
try:
# delete all JSON files starting with stormName
for fn in glob.iglob(os.path.join(tcvDir, stormName + "*.json")):
try:
site = fn.replace(siteDir,"").split("/")[1]
basename = os.path.basename(fn)
logDebug("removing canceled file: ", os.path.join(site, "gfe/tcvAdvisories", basename))
LocalizationSupport.deleteFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.SITE, site,
"gfe/tcvAdvisories/" + basename)
except:
logException("Error removing " + fn)
os.remove(tmpFile)
except:
logException("Error removing JSON files for " + stormName)
# copy in the json files
for tmpFile in glob.iglob(os.path.join(tmpDir, "*/gfe/tcvAdvisories/*.json")):
site = tmpFile.replace(tmpDir,"").split("/")[1]
jsonFile = "gfe/tcvAdvisories/" + os.path.basename(tmpFile)
logDebug("copying "+tmpFile+" to "+jsonFile)
try:
with open(tmpFile, 'r') as tf:
jsonData = tf.read()
LocalizationSupport.writeFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.SITE,
site, jsonFile, jsonData)
os.remove(tmpFile)
except:
logException("Error copying JSON file: "+jsonFile)
# delete tmpDir
try:
for dirpath, dirs, files in os.walk(tmpDir, topdown=False):
os.rmdir(dirpath)
except:
logException("Unable to remove "+ tmpDir)
def getTCVFiles(ourMhsID, srcServer, destE):
import IrtAccess
import TCVUtil
import siteConfig
irt = IrtAccess.IrtAccess("")
localSites = [srcServer['site']]
for addressE in destE:
if addressE.tag != "address":
continue
destServer = irt.decodeXMLAddress(addressE)
if destServer['mhsid'] == ourMhsID:
localSites.append(destServer['site'])
logEvent("Sending TCV files for " + str(localSites) + " to " + srcServer['mhsid'])
tcvProductsDir = os.path.join(siteConfig.GFESUITE_HOME, "products", "TCV")
# create tcvProductsDir if necessary
try:
os.makedirs(tcvProductsDir, 0755)
except OSError, e:
if e.errno != errno.EEXIST:
logger.warn("%s: '%s'" % (e.strerror,e.filename))
# get temporary file name for packaged TCV files
with tempfile.NamedTemporaryFile(suffix='.sendtcv', dir=tcvProductsDir, delete=False) as fp:
fname = fp.name
try:
TCVUtil.packageTCVFiles(localSites, fname, getLogger())
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
iscE = ElementTree.Element('isc')
irt.addSourceXML(iscE, destServer)
irt.addDestinationXML(iscE, [srcServer])
# create the XML file
with tempfile.NamedTemporaryFile(suffix='.xml', dir=tcvProductsDir, delete=False) as fd:
fnameXML = fd.name
fd.write(ElementTree.tostring(iscE))
# send the files to srcServer
sendMHSMessage("PUT_TCV_FILES", srcServer['mhsid'], [fname, fnameXML])
except:
logException('Error sending TCV files for ' + str(localSites))
# get servers direct call for IRT
def irtGetServers(ancfURL, bncfURL, iscWfosWanted):
import IrtAccess
@ -227,15 +370,22 @@ def makeISCrequest(xmlRequest, gridDims, gridProj, gridBoundBox, mhs, host, port
# we need to modify the incoming xmlRequest and add the <source>
# and move the <welist> into the <source> <address>
requestTree = ElementTree.ElementTree(ElementTree.XML(xmlRequest))
requestE = requestTree.getroot()
ElementTree.tostring(requestE)
ourServer = {'mhsid': ServerMHS, 'host': ServerHost, 'port': ServerPort,
'protocol': ServerProtocol, 'site': ServerSite,
'area': {'xdim': gridDims[0], 'ydim': gridDims[1]},
'domain': {'proj': gridProj,
'origx': gridBoundBox[0][0], 'origy': gridBoundBox[0][1],
'extx': gridBoundBox[1][0], 'exty': gridBoundBox[1][1]}}
requestE = ElementTree.fromstring(xmlRequest)
ourServer = {'mhsid': ServerMHS,
'host': ServerHost,
'port': ServerPort,
'protocol': ServerProtocol,
'site': ServerSite,
'area': {'xdim': gridDims[0],
'ydim': gridDims[1]
},
'domain': {'proj': gridProj,
'origx': gridBoundBox[0][0],
'origy': gridBoundBox[0][1],
'extx': gridBoundBox[1][0],
'exty': gridBoundBox[1][1]
}
}
sourcesE, addressE = irt.addSourceXML(requestE, ourServer)
#find the <welist> and move it
@ -310,7 +460,7 @@ def makeISCrequest(xmlRequest, gridDims, gridProj, gridBoundBox, mhs, host, port
os._exit(0)
def serviceISCRequest(xmlRequest):
def serviceISCRequest(dataFile):
# function called by iscDataRec with an isc request to be serviced.
# We take this information, convert it into a different format,
# and queue the request via the IFPServer to the SendISCMgr
@ -324,7 +474,7 @@ def serviceISCRequest(xmlRequest):
logEvent("serviceISCRequest.....")
# validate xml
inTree = ElementTree.ElementTree(ElementTree.XML(xmlRequest))
inTree = ElementTree.parse(dataFile)
inE = inTree.getroot()
if inE.tag != "iscrequest":
raise Exception, "iscrequest packet missing from request"
@ -360,3 +510,49 @@ def irtGetServers(ancfURL, bncfURL, iscWfosWanted):
status, xml = irt.getServers(iscWfosWanted)
return xml
def sendMHSMessage(subject, adressees, attachments, xmtScript=None):
# Transmit the request -- do string substitution
import siteConfig
from com.raytheon.edex.plugin.gfe.config import IFPServerConfigManager
config = IFPServerConfigManager.getServerConfig(siteConfig.GFESUITE_SITEID)
ourMHS = siteConfig.GFESUITE_MHSID
if xmtScript is None:
xmtScript = config.transmitScript()
# create the required wmoid
wmoid = "TTAA00 "
if ourMHS in ['SJU']:
wmoid += "TJSJ"
elif ourMHS in ['AFG', 'AJK', 'HFO', 'GUM']:
wmoid += "P" + ourMHS
elif ourMHS in ['AER', 'ALU']:
wmoid += "PAFC"
elif len(ourMHS) == 3:
wmoid += "K" + ourMHS
elif len(ourMHS) == 4:
wmoid += ourMHS
else:
wmoid = "XXXX"
wmoid += " " + time.strftime("%d%H%M", time.gmtime(time.time()))
if type(adressees) in [list, tuple]:
adressees = ",".join(addresses)
if type(attachments) in [list, tuple]:
attachments = ",".join(attachments)
cmd = copy.deepcopy(xmtScript)
for s1, s2 in [("%SUBJECT", subject),
("%ADDRESSES", adressees),
("%WMOID", wmoid),
("%ATTACHMENTS", attachments)]:
cmd = cmd.replace(s1, s2)
logDebug("cmd: "+ cmd)
# start subprocess to actually make the call
try:
subprocess.check_call([cmd], shell=True)
except:
logException("Error running cmd: " + cmd)

View file

@ -43,9 +43,10 @@ from java.util import ArrayList
# for iscMosaic, support changes
# to IscReceiveSrv.
# 01/24/14 2504 randerso removed obsolete A1 comments
#
#
# 12/08/2014 4953 randerso Added support for sending/receiving TCV files
# Additional code cleanup
#
##
iscDataRecLogger=None
@ -92,9 +93,9 @@ def execIscDataRec(MSGID,SUBJECT,FILES):
ourMhsID = siteConfig.GFESUITE_MHSID
# for most transactions, first attachment is the data file, 2nd file is the
# XML destinations. The ISCREQUEST is unique with only 1 file being the
# XML destinations. ISCREQUEST and GET_TCV_FILES have only 1 file being the
# XML destinations. We simulate two files naming them the same.
if SUBJECT == "ISCREQUEST":
if SUBJECT in ["ISCREQUEST", "GET_TCV_FILES"]:
FILES.append(FILES[0])
dataFile = FILES[0] #first attachment is always the data file
@ -157,78 +158,83 @@ def execIscDataRec(MSGID,SUBJECT,FILES):
logProblem("destinations packet missing from xml")
return
# decode and print the source server (if present)
for addressE in destE:
if addressE.tag != "address":
continue
# Handle GET_TCV_FILES out side the loop as it needs to do it's own loop
if SUBJECT == 'GET_TCV_FILES':
IrtServer.getTCVFiles(ourMhsID, srcServer, destE)
else:
# decode and print the source server (if present)
for addressE in destE:
if addressE.tag != "address":
continue
destServer = irt.decodeXMLAddress(addressE)
# find destination server information
mhsidDest=serverDest=portDest=protocolDest=None
for attrE in addressE.getchildren():
if attrE.tag == "mhsid":
mhsidDest = attrE.text
elif attrE.tag == "server":
serverDest = attrE.text
elif attrE.tag == "port":
portDest = attrE.text
elif attrE.tag == "protocol":
protocolDest = attrE.text
if destServer['mhsid'].upper() != ourMhsID.upper():
logDebug(SUBJECT, 'Not our mhs of ' + ourMhsID + \
', so skipped:', irt.printServerInfo(destServer))
continue #this destination is for someone else.
# transmit the data to the ifpServer
time2 = time.clock()
destServer = irt.decodeXMLAddress(addressE)
if SUBJECT == 'PUT_ACTIVE_TABLE':
IrtServer.putVTECActiveTable(dataFile, None)
elif SUBJECT == 'PUT_ACTIVE_TABLE2':
IrtServer.putVTECActiveTable(dataFile, xmlFileBuf)
elif SUBJECT == 'GET_ACTIVE_TABLE':
IrtServer.getVTECActiveTable(dataFile, None)
elif SUBJECT == 'GET_ACTIVE_TABLE2':
IrtServer.getVTECActiveTable(dateFile, xmlFileBuf)
elif SUBJECT in ['ISCGRIDS', 'ISCGRIDS2']:
args = {"siteID": siteConfig.GFESUITE_SITEID,
"userID": 'SITE',
"databaseID": siteConfig.GFESUITE_SITEID+"_GRID__ISC_00000000_0000",
"parmsToProcess": [],
"blankOtherPeriods": True,
"startTime": None,
"endTime": None,
"altMask": None,
"replaceOnly": False,
"eraseFirst": False,
"announce": "ISC: ",
"renameWE": True,
"iscSends": False,
"inFiles": [dataFile],
"ignoreMask": False,
"adjustTranslate": True,
"deleteInput": True,
"parmsToIgnore": [],
"gridDelay": 0.0,
"logFileName": None}
mosaic = iscMosaic.IscMosaic(args)
mosaic.execute()
# find destination server information
mhsidDest=serverDest=portDest=protocolDest=None
for attrE in addressE.getchildren():
if attrE.tag == "mhsid":
mhsidDest = attrE.text
elif attrE.tag == "server":
serverDest = attrE.text
elif attrE.tag == "port":
portDest = attrE.text
elif attrE.tag == "protocol":
protocolDest = attrE.text
if destServer['mhsid'].upper() != ourMhsID.upper():
logDebug(SUBJECT, 'Not our mhs of ' + ourMhsID + \
', so skipped:', irt.printServerInfo(destServer))
continue #this destination is for someone else.
# transmit the data to the ifpServer
with open(dataFile, "rb") as fp:
fpData = fp.read()
time2 = time.clock()
if SUBJECT == 'PUT_ACTIVE_TABLE':
IrtServer.putVTECActiveTable(fpData, None)
elif SUBJECT == 'PUT_ACTIVE_TABLE2':
IrtServer.putVTECActiveTable(fpData, xmlFileBuf)
elif SUBJECT == 'GET_ACTIVE_TABLE':
IrtServer.getVTECActiveTable(fpData, None)
elif SUBJECT == 'GET_ACTIVE_TABLE2':
IrtServer.getVTECActiveTable(fpData, xmlFileBuf)
elif SUBJECT in ['ISCGRIDS', 'ISCGRIDS2']:
args = {"siteID": siteConfig.GFESUITE_SITEID,
"userID": 'SITE',
"databaseID": siteConfig.GFESUITE_SITEID+"_GRID__ISC_00000000_0000",
"parmsToProcess": [],
"blankOtherPeriods": True,
"startTime": None,
"endTime": None,
"altMask": None,
"replaceOnly": False,
"eraseFirst": False,
"announce": "ISC: ",
"renameWE": True,
"iscSends": False,
"inFiles": [dataFile],
"ignoreMask": False,
"adjustTranslate": True,
"deleteInput": True,
"parmsToIgnore": [],
"gridDelay": 0.0,
"logFileName": None}
mosaic = iscMosaic.IscMosaic(args)
mosaic.execute()
elif SUBJECT == 'ISCREQUEST':
IrtServer.serviceISCRequest(fpData)
else:
nosend = True
logProblem("unknown subject: ", SUBJECT)
continue
time3 = time.clock()
delta1 = time2-time1
delta2 = time3-time2
logEvent('Sent to:',
irt.printServerInfo(destServer), "connectT=", delta1, "xmtT=", delta2)
elif SUBJECT == 'ISCREQUEST':
IrtServer.serviceISCRequest(dataFile)
elif SUBJECT == 'PUT_TCV_FILES':
IrtServer.putTCVFiles(srcServer.get('site'), dataFile)
pass
else:
nosend = True
logProblem("unknown subject: ", SUBJECT)
continue
time3 = time.clock()
delta1 = time2-time1
delta2 = time3-time2
logEvent('Sent to:',
irt.printServerInfo(destServer), "connectT=", delta1, "xmtT=", delta2)
except:
logProblem("iscDataRec failed!",traceback.format_exc())
finally:

View file

@ -516,24 +516,39 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis,
nwsIntroUsed = 1
if phraseCount == 0:
phraseCount = 1
hazardBodyPhrase = hazardBodyPhrase + " HAS ISSUED " + \
hazNameA + forPhrase + \
"...WHICH IS IN EFFECT" + endTimePhrase + ". "
if eachHazard['phen'] in ['HU', 'TR', 'TY']:
hazardBodyPhrase = hazardBodyPhrase + " HAS ISSUED " + \
hazNameA + ". "
else:
hazardBodyPhrase = hazardBodyPhrase + " HAS ISSUED " + \
hazNameA + forPhrase + \
"...WHICH IS IN EFFECT" + endTimePhrase + ". "
elif phraseCount == 1:
phraseCount = 2
if hdln != lastHdln:
hazardBodyPhrase = hazardBodyPhrase + hazNameA + \
" HAS ALSO BEEN ISSUED. THIS " + hazName + forPhrase + \
" IS IN EFFECT" + endTimePhrase + ". "
if eachHazard['phen'] in ['HU', 'TR', 'TY']:
hazardBodyPhrase = hazardBodyPhrase + hazNameA + \
" HAS ALSO BEEN ISSUED."
else:
hazardBodyPhrase = hazardBodyPhrase + hazNameA + \
" HAS ALSO BEEN ISSUED. THIS " + hazName + forPhrase + \
" IS IN EFFECT" + endTimePhrase + ". "
else:
hazardBodyPhrase = hazardBodyPhrase + hazNameA + \
" HAS ALSO BEEN ISSUED" + endTimePhrase + ". "
if eachHazard['phen'] in ['HU', 'TR', 'TY']:
hazardBodyPhrase = hazardBodyPhrase + hazNameA + \
" HAS ALSO BEEN ISSUED."
else:
hazardBodyPhrase = hazardBodyPhrase + hazNameA + forPhrase + \
" HAS ALSO BEEN ISSUED" + endTimePhrase + ". "
else:
hazardBodyPhrase = hazardBodyPhrase + "IN ADDITION..." + \
hazNameA + forPhrase + " HAS BEEN ISSUED. THIS " + hazName + \
" IS IN EFFECT" + endTimePhrase + ". "
lastHdln = hdln
if eachHazard['phen'] in ['HU', 'TR', 'TY']:
hazardBodyPhrase = hazardBodyPhrase + "IN ADDITION..." + \
hazNameA + " HAS BEEN ISSUED."
else:
hazardBodyPhrase = hazardBodyPhrase + "IN ADDITION..." + \
hazNameA + forPhrase + " HAS BEEN ISSUED. THIS " + hazName + \
" IS IN EFFECT" + endTimePhrase + ". "
lastHdln = hdln
#
# This is for the can hazards
#

View file

@ -783,8 +783,7 @@ public class RadarDecoder extends AbstractDecoder {
if (alertMessage.getGridBoxAz() == 0
&& alertMessage.getGridBoxRange() == 0
&& alertMessage.getThresholdValue() == 0
&& alertMessage.getExceedingValue() == 0
&& (alertMessage.getAlertCategory() == 16 || alertMessage.getAlertCategory() == 25))
&& alertMessage.getExceedingValue() == 0)
return false;
return true;

View file

@ -44,6 +44,7 @@
# May 15, 2014 2536 bclement moved WMO time parsing to WMOTimeParser
# May 15, 2014 3157 dgilling Update location of WclInfo class.
# Jun 10, 2014 3268 dgilling Update location of WclInfo class.
# Dec 17, 2014 4953 randerso Fixed decoding of non-VTEC from command line
# </pre>
#
@ -114,10 +115,10 @@ class StdWarningDecoder():
self._timeOffset = 0
#decode the command line
if text is None and filePath is None:
if command is not None:
self._decodeCommandLine()
self._rawMessage = None
checkForWmo = False
checkForWmo = True
else:
self._rawMessage = text
checkForWmo = True

View file

@ -14,6 +14,10 @@ PR \ MUNICIPALITY
PUERTO RICO \ MUNICIPALITY
PR+ \ MUNICIPALITIES
PUERTO RICO+ \ MUNICIPALITIES
GU \
GUAM \
GU+ \
GUAM+ \
DEFAULT+ \ COUNTIES
DEFAULT \ COUNTY
CITY \

View file

@ -13,6 +13,11 @@
THIS CHANGE WAS DONE SO THAT CONFIGURATIONS COULD BE MADE IN ONE LOCATION
AND NOT ACROSS 20-30 TEMPLATES. A COUNTY-BASED and ZONE-BASED COUNTERPART
EXISTS TO THIS FILE.
SOFTWARE HISTORY
Date Ticket# Engineer Description
01/20/15 RM #14929 Qinglu Lin Changed false to true for <withinPolygon> tags in <pathcastConfig>,
<pointSource variable="otherPoints>, and <pointSource variable="locationList">.
-->
<!-- CREATE DEFAULT OBJECTS. THIS SHOULD GENERALLY NOT BE TOUCHED-->
@ -96,10 +101,7 @@
<!-- CREATE pathcastConfig OBJECT FOR PATHCAST (4TH BULLET) -->
<pathcastConfig>
<type>AREA</type>
<!-- the withinPolygon variable set to false will bring in points
outside of the polygon which is necessary for the pathcast to reference
points that are near the water but not on the water -->
<withinPolygon>false</withinPolygon>
<withinPolygon>true</withinPolygon>
<inclusionPercent>1</inclusionPercent>
<distanceThreshold>10.0</distanceThreshold>
<interval>5</interval>
@ -131,7 +133,7 @@
<inclusionPercent>1</inclusionPercent>
<type>AREA</type>
<searchMethod>TRACK</searchMethod>
<withinPolygon>false</withinPolygon>
<withinPolygon>true</withinPolygon>
<maxResults>10</maxResults>
<distanceThreshold>10</distanceThreshold>
<sortBy>
@ -154,7 +156,7 @@
<inclusionPercent>1</inclusionPercent>
<type>AREA</type>
<searchMethod>TRACK</searchMethod>
<withinPolygon>false</withinPolygon>
<withinPolygon>true</withinPolygon>
<maxResults>20</maxResults>
<distanceThreshold>10</distanceThreshold>
<filter>

View file

@ -42,6 +42,7 @@
<bean ref="practiceVtecDecoder" method="decode"/>
<bean ref="index" method="index"/>
<bean ref="processUtil" method="log"/>
<multicast parallelProcessing="false">
<filter>
<simple>${header?.notifygfe.booleanValue}</simple>

View file

@ -34,7 +34,9 @@ import com.raytheon.uf.common.util.FileUtil;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 27, 2013 dgilling Initial creation
* Feb 27, 2013 dgilling Initial creation
* Dec 12, 2014 4953 randerso Added getCommonGfeIncludePath to allow use of
* LocalizationSupport in activetable python code
*
* </pre>
*
@ -46,6 +48,8 @@ public class ActiveTablePyIncludeUtil extends PythonIncludePathUtil {
public static final String GFE = "gfe";
public static final String COMMON_GFE = FileUtil.join(PYTHON, GFE);
public static final String GFE_CONFIG = FileUtil.join("config", GFE);
public static final String ISC = FileUtil.join(GFE, "isc");
@ -74,4 +78,11 @@ public class ActiveTablePyIncludeUtil extends PythonIncludePathUtil {
return PyUtil.buildJepIncludePath(siteDir, baseDir);
}
public static String getCommonGfeIncludePath() {
String pythonDir = getCommonPythonIncludePath();
String gfeDir = getPath(PATH_MANAGER.getContext(
LocalizationType.COMMON_STATIC, LocalizationLevel.BASE),
COMMON_GFE);
return PyUtil.buildJepIncludePath(pythonDir, gfeDir);
}
}

View file

@ -88,7 +88,7 @@ public class ActiveTableSrv {
timer.start();
try {
ActiveTable activeTable = threadLocalActiveTable.get();
if (records != null && records.size() > 0) {
if ((records != null) && (records.size() > 0)) {
activeTable.merge(ActiveTableRecord.transformFromWarnings(
records, ActiveTableMode.OPERATIONAL));
}
@ -111,7 +111,7 @@ public class ActiveTableSrv {
public void practiceVtecArrived(List<AbstractWarningRecord> records,
Headers headers) {
int offsetSeconds = getOffsetTime((String) headers.get("drtstring"));
if (records != null && records.size() > 0) {
if ((records != null) && (records.size() > 0)) {
ActiveTable activeTable = threadLocalActiveTable.get();
try {
activeTable.merge(ActiveTableRecord.transformFromWarnings(

View file

@ -46,6 +46,8 @@ import com.raytheon.uf.edex.python.decoder.PythonDecoder;
* used for all practice VTEC products
* Changed to take in the SendPracticeProductRequest
* to simplify spring wiring
* Changed to set the filepath when calling Python decoder
* so _checkForVTEC will work
*
* </pre>
*
@ -103,7 +105,7 @@ public class PracticeVtecDecoder extends PythonDecoder {
// create an argument map to run the decoder
Map<String, Object> decoderArgs = new HashMap<String, Object>(4);
decoderArgs.put("filePath", null);
decoderArgs.put("filePath", file.getAbsolutePath());
decoderArgs.put("command", sb.toString());
return decode(decoderArgs);

View file

@ -0,0 +1,79 @@
##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
#
# Common utilities for sending/receiving TCV files
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 12/12/14 4953 randerso Initial Creation.
#
##
import glob, os, subprocess, time
import LocalizationSupport
def getCaveStaticSiteDir():
# this should return /awips2/edex/data/utility/cave_static/site
import siteConfig
siteID = siteConfig.GFESUITE_SITEID
siteDir = LocalizationSupport.getLocalizationFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.SITE,
siteID, "gfe").getFile()
siteDir = siteDir.getParentFile().getParentFile().getAbsolutePath()
return siteDir
def purgeAllCanFiles(logger):
PURGE_AGE = 30 * 24 * 60 * 60 # 30 days in seconds
siteDir = getCaveStaticSiteDir()
# purge allCan files older than PURGE_AGE
purgeTime = time.time() - PURGE_AGE
for f in glob.iglob(os.path.join(siteDir, "*/gfe/tcvAdvisories/*.allCAN")):
site = f.replace(siteDir,"").split("/")[1]
basename = os.path.basename(f)
try:
modTime = os.path.getmtime(f)
if modTime < purgeTime:
logger.debug("Purging "+basename+": "+time.strftime("%Y%m%d %H%M%S", time.gmtime(modTime)))
LocalizationSupport.deleteFile(LocalizationSupport.CAVE_STATIC,
LocalizationSupport.SITE, site,
"gfe/tcvAdvisories/" + basename)
except:
logger.exception("Unable to delete "+f)
def packageTCVFiles(siteList, fileName, logger):
siteDir = getCaveStaticSiteDir()
cmd = "cd " + siteDir + "; tar cvzf " + fileName
for siteID in siteList:
tcvDir = os.path.join(siteID, "gfe", "tcvAdvisories")
for fileType in ["*.json", "*.allCAN"]:
path = os.path.join(tcvDir, fileType)
if len(glob.glob(os.path.join(siteDir, path))) > 0:
cmd += " " + path
logger.debug("cmd: '" + cmd + "'")
subprocess.check_call([cmd], shell=True)

View file

@ -57,7 +57,7 @@ VTEC_DECODER_SITES = []
# The following list is a set of product categories (e.g., ZFP, WOU) that
# when decoded, the text for each segment is captured. The text is not
# normally needed to be captured except for warning-style products.
VTEC_CAPTURE_TEXT_CATEGORIES = ['WSW', 'NPW', 'RFW', 'FFA', 'CFW', 'MWS', 'HLS', 'MWW']
VTEC_CAPTURE_TEXT_CATEGORIES = ['WSW', 'NPW', 'RFW', 'FFA', 'CFW', 'MWS', 'HLS', 'MWW', 'TCV']
# Remapping of product pils. This is required for certain VTEC events
# if a hazard is created in one pil and then updated or cancelled in another
@ -146,6 +146,7 @@ BackupDict = {
'HFO': ('GUM', 'MTR'),
'HGX': ('LCH', 'CRP'),
'HNX': ('STO', 'SGX'),
'HPA': ('HFO', 'NH1'),
'HUN': ('JAN', 'BMX'),
'ICT': ('TOP', 'DDC'),
'ILM': ('CHS', 'MHX'),
@ -181,9 +182,13 @@ BackupDict = {
'MRX': ('OHX', 'FFC'),
'MSO': ('TFX', 'GGW'),
'MTR': ('LOX', 'EKA'),
'NH1': ('NH2', 'ONP'),
'NH2': ('NH1', 'ONA'),
'OAX': ('GID', 'FSD'),
'OHX': ('MRX', 'MEG'),
'OKX': ('BOX', 'PHI'),
'ONA': ('ONP', 'NH2'),
'ONP': ('ONA', 'NH1'),
'OTX': ('PDT', 'MSO'),
'OUN': ('TSA', 'FWD'),
'PAH': ('LMK', 'SGF'),
@ -221,10 +226,16 @@ BackupDict = {
def get4ID(id):
if id in ['SJU']:
return "TJSJ"
elif id in ['AFG', 'AJK', 'HFO', 'GUM']:
elif id in ['AFG', 'AJK', 'GUM']:
return "P" + id
elif id in ['HFO', 'HPA']:
return "PHFO"
elif id in ['AER', 'ALU']:
return "PAFC"
elif id in ['NH1', 'NH2']:
return "KNHC"
elif id in ['ONA', 'ONP']:
return "KWBC"
else:
return "K" + id

View file

@ -0,0 +1,210 @@
##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
#
# Request TCV Advisory Files
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 12/05/14 4953 randerso Initial Creation.
#
##
import os, errno, tempfile
import xml
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
import IrtAccess
import VTECPartners
logger = None
def init_logging():
import iscUtil
import logging
global logger
logger = iscUtil.getLogger("requestTCV", logLevel=logging.DEBUG)
def createDestinationXML(siteID, host, port, protocol, mhsid, ancf, bncf, logger):
#--------------------------------------------------------------------
# Assemble XML source/destination document
#--------------------------------------------------------------------
msgSendDest = [] #list of mhs sites to send request
irt = IrtAccess.IrtAccess(ancf, bncf)
iscE = ElementTree.Element('isc')
# this is the requestor of the data
sourceServer = {'mhsid' : mhsid,
'host' : host,
'port' : port,
'protocol': protocol,
'site' : siteID}
irt.addSourceXML(iscE, sourceServer)
logger.info("Requesting Server: " + irt.printServerInfo(sourceServer))
# who is running the domains requested?
sites = VTECPartners.VTEC_TABLE_REQUEST_SITES
if not sites:
logger.error('No sites defined for VTEC_TABLE_REQUEST_SITES')
sys.exit(1)
status, xml = irt.getServers(sites)
if not status:
logger.error('Failure to getServers from IRT')
sys.exit(1)
# decode the XML
try:
serverTree = ElementTree.ElementTree(ElementTree.XML(xml))
serversE = serverTree.getroot()
except:
logger.exception("Malformed XML on getServers()")
sys.exit(1)
if serversE.tag != "servers":
logger.error("Servers packet missing from web server")
sys.exit(1)
# process each requested domain returned to us
chosenServers = []
matchingServers = []
for domainE in serversE:
if domainE.tag != "domain":
continue
servers = [] #list of servers for this domain
# decode each server in the domain
for addressE in domainE.getchildren():
info = irt.decodeXMLAddress(addressE)
if info is None:
continue #not address tag
# remove unneeded keys
for key in ['parms', 'area', 'domain']:
if info.has_key(key):
del info[key]
servers.append(info)
matchingServers.append(info)
# server search list in priority. The px3 entries are used for
# dual domain for AFC.
hp = [('dx4','98000000'),('px3', '98000000'), ('dx4','98000001'),
('px3', '98000001')]
# choose one server from this domain, find first dx4, 98000000
# try to use one with the same mhsidDest as the site, which
# would be the primary operational GFE. Note that the px3 entries
# are for AFC.
found = False
for matchServer, matchPort in hp:
for server in servers:
if server['host'][0:3] == matchServer and \
server['port'] == matchPort and server['mhsid'] == siteID:
chosenServers.append(server)
if server['mhsid'] not in msgSendDest:
msgSendDest.append(server['mhsid'])
found = True
break
# find first dx4, 98000000, but perhaps a different mhsid
# this is probably not the primary operational GFE
if not found:
for matchServer, matchPort in hp:
for server in servers:
if server['host'][0:3] == matchServer and \
server['port'] == matchPort:
chosenServers.append(server)
if server['mhsid'] not in msgSendDest:
msgSendDest.append(server['mhsid'])
found = True
break
# if didn't find standard one, then take the first one, but don't
# take ourselves unless we are the only one.
if not found and servers:
for server in servers:
if server['mhsid'] != mhsid and server['host'] != host \
and server['port'] != port and \
server['mhsid'] != siteID:
chosenServers.append(server)
if server['mhsid'] not in msgSendDest:
msgSendDest.append(server['mhsid'])
found = True
if not found:
chosenServers.append(server)
if servers[0]['mhsid'] not in msgSendDest:
msgSendDest.append(servers[0]['mhsid'])
# Display the set of matching servers
s = "Matching Servers:"
for x in matchingServers:
s += "\n" + irt.printServerInfo(x)
logger.info(s)
# Display the chosen set of servers
s = "Chosen Servers:"
for x in chosenServers:
s += "\n" + irt.printServerInfo(x)
logger.info(s)
irt.addDestinationXML(iscE, chosenServers)
return msgSendDest, iscE
def runFromJava(siteID, config):
import siteConfig
host = str(config.getServerHost())
port = str(config.getRpcPort())
protocol = str(config.getProtocolVersion())
mhsid = str(config.getMhsid())
ancf = str(config.iscRoutingTableAddress().get("ANCF"))
bncf = str(config.iscRoutingTableAddress().get("BNCF"))
xmtScript = str(config.transmitScript())
init_logging()
tempdir = os.path.join(siteConfig.GFESUITE_HOME, "products", "TCV")
try:
os.makedirs(tempdir, 0755)
except OSError, e:
if e.errno != errno.EEXIST:
logger.warn("%s: '%s'" % (e.strerror,e.filename))
try:
msgSendDest, xml = createDestinationXML(siteID, host, port, protocol, mhsid, ancf, bncf, logger)
# create the XML file
with tempfile.NamedTemporaryFile(suffix='.xml', dir=tempdir, delete=False) as fd:
fnameXML = fd.name
fd.write(ElementTree.tostring(xml))
# don't send to ourselves
if mhsid in msgSendDest:
msgSendDest.remove(mhsid)
if len(msgSendDest) > 0:
# Now send the message
irt = IrtAccess.IrtAccess(ancf, bncf)
irt.transmitFiles("GET_TCV_FILES", msgSendDest, mhsid, [fnameXML], xmtScript)
except:
logger.exception('Error requesting TCV files for site: ' + siteID)

View file

@ -0,0 +1,225 @@
##
# 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.
##
#
# Send TCV Advisory Files to VTEC partners
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 12/05/14 4953 randerso Initial Creation.
#
##
import os, errno, tempfile
import xml
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
import IrtAccess
import TCVUtil
import VTECPartners
logger = None
def init_logging():
import iscUtil
import logging
global logger
logger = iscUtil.getLogger("sendTCV", logLevel=logging.DEBUG)
def createDestinationXML(siteID, host, port, protocol, mhsid, ancf, bncf, logger):
#--------------------------------------------------------------------
# Assemble XML source/destination document
#--------------------------------------------------------------------
msgSendDest = [] #list of mhs sites to send request
irt = IrtAccess.IrtAccess(ancf, bncf)
iscE = ElementTree.Element('isc')
# this is the requestor of the data
sourceServer = {'mhsid' : mhsid,
'host' : host,
'port' : port,
'protocol': protocol,
'site' : siteID}
irt.addSourceXML(iscE, sourceServer)
logger.info("Requesting Server: " + irt.printServerInfo(sourceServer))
# who is running the domains requested?
sites = VTECPartners.VTEC_TABLE_REQUEST_SITES
if not sites:
logger.error('No sites defined for VTEC_TABLE_REQUEST_SITES')
sys.exit(1)
status, xml = irt.getServers(sites)
if not status:
logger.error('Failure to getServers from IRT')
sys.exit(1)
# decode the XML
try:
serverTree = ElementTree.ElementTree(ElementTree.XML(xml))
serversE = serverTree.getroot()
except:
logger.exception("Malformed XML on getServers()")
sys.exit(1)
if serversE.tag != "servers":
logger.error("Servers packet missing from web server")
sys.exit(1)
# process each requested domain returned to us
chosenServers = []
matchingServers = []
for domainE in serversE:
if domainE.tag != "domain":
continue
servers = [] #list of servers for this domain
# decode each server in the domain
for addressE in domainE.getchildren():
info = irt.decodeXMLAddress(addressE)
if info is None:
continue #not address tag
# remove unneeded keys
for key in ['parms', 'area', 'domain']:
if info.has_key(key):
del info[key]
servers.append(info)
matchingServers.append(info)
# server search list in priority. The px3 entries are used for
# dual domain for AFC.
hp = [('dx4','98000000'),('px3', '98000000'), ('dx4','98000001'),
('px3', '98000001')]
# choose one server from this domain, find first dx4, 98000000
# try to use one with the same mhsidDest as the site, which
# would be the primary operational GFE. Note that the px3 entries
# are for AFC.
found = False
for matchServer, matchPort in hp:
for server in servers:
if server['host'][0:3] == matchServer and \
server['port'] == matchPort and server['mhsid'] == siteID:
if server['mhsid'] not in msgSendDest:
chosenServers.append(server)
msgSendDest.append(server['mhsid'])
found = True
break
# find first dx4, 98000000, but perhaps a different mhsid
# this is probably not the primary operational GFE
if not found:
for matchServer, matchPort in hp:
for server in servers:
if server['host'][0:3] == matchServer and \
server['port'] == matchPort:
if server['mhsid'] not in msgSendDest:
chosenServers.append(server)
msgSendDest.append(server['mhsid'])
found = True
break
# if didn't find standard one, then take the first one, but don't
# take ourselves unless we are the only one.
if not found and servers:
for server in servers:
if server['mhsid'] != mhsid and server['host'] != host \
and server['port'] != port and \
server['mhsid'] != siteID:
if server['mhsid'] not in msgSendDest:
chosenServers.append(server)
msgSendDest.append(server['mhsid'])
found = True
if not found:
if servers[0]['mhsid'] not in msgSendDest:
chosenServers.append(servers[0])
msgSendDest.append(servers[0]['mhsid'])
# Display the set of matching servers
s = "Matching Servers:"
for x in matchingServers:
s += "\n" + irt.printServerInfo(x)
logger.info(s)
# Display the chosen set of servers
s = "Chosen Servers:"
for x in chosenServers:
s += "\n" + irt.printServerInfo(x)
logger.info(s)
irt.addDestinationXML(iscE, chosenServers)
return msgSendDest, iscE
def runFromJava(siteID, config):
import siteConfig
host = str(config.getServerHost())
port = str(config.getRpcPort())
protocol = str(config.getProtocolVersion())
mhsid = str(config.getMhsid())
ancf = str(config.iscRoutingTableAddress().get("ANCF"))
bncf = str(config.iscRoutingTableAddress().get("BNCF"))
xmtScript = str(config.transmitScript())
init_logging()
TCVUtil.purgeAllCanFiles(logger)
tcvProductsDir = os.path.join(siteConfig.GFESUITE_HOME, "products", "TCV")
# create tcvProductsDir if necessary
try:
os.makedirs(tcvProductsDir, 0755)
except OSError, e:
if e.errno != errno.EEXIST:
logger.warn("%s: '%s'" % (e.strerror,e.filename))
# get temporary file name for packaged TCV files
with tempfile.NamedTemporaryFile(suffix='.sendtcv', dir=tcvProductsDir, delete=False) as fp:
fname = fp.name
try:
TCVUtil.packageTCVFiles([siteID], fname, logger)
msgSendDest, xml = createDestinationXML(siteID, host, port, protocol, mhsid, ancf, bncf, logger)
# create the XML file
with tempfile.NamedTemporaryFile(suffix='.xml', dir=tcvProductsDir, delete=False) as fd:
fnameXML = fd.name
fd.write(ElementTree.tostring(xml))
# don't send to ourselves
if mhsid in msgSendDest:
msgSendDest.remove(mhsid)
if len(msgSendDest) > 0:
# Now send the message
irt = IrtAccess.IrtAccess(ancf, bncf)
logger.debug("msgSendDest: "+ str(msgSendDest))
irt.transmitFiles("PUT_TCV_FILES", msgSendDest, mhsid, [fname, fnameXML], xmtScript)
except:
logger.exception('Error sending TCV files for site: ' + siteID)

View file

@ -21,6 +21,7 @@ package com.raytheon.uf.edex.plugin.hpe.util;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.SortedMap;
@ -44,7 +45,7 @@ import com.raytheon.uf.edex.plugin.hpe.util.HpeEnums.HpeDataSource;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 26, 2014 3026 mpduff Initial creation
* Nov 12, 2014 3026 mpduff Fix handling of query results
* Nov 12, 2014 3026 mpduff Fix handling of query results and query by current hour
*
* </pre>
*
@ -94,6 +95,16 @@ public class HpeDataAccessor {
Date recdate, String productName) throws Exception {
SortedMap<String, List<BiasDynRecord>> dataMap = new TreeMap<String, List<BiasDynRecord>>();
/*
* Bias data are by the hour. Get the current hour to query on
*/
long ms = recdate.getTime();
Calendar currentHour = TimeUtil.newGmtCalendar();
currentHour.setTimeInMillis(ms);
currentHour.set(Calendar.MINUTE, 0);
currentHour.set(Calendar.SECOND, 0);
currentHour.set(Calendar.MILLISECOND, 0);
HpeRadarResult hpeResult = getHpeRadarResult(recdate, productName);
HpeDataSource source = hpeResult.getRadarDataSource();
@ -115,7 +126,8 @@ public class HpeDataAccessor {
query.append(" from ").append(table);
query.append(" where office_id ").append(" = '").append(office)
.append("'");
query.append(" and obstime = '").append(sdf.get().format(recdate));
query.append(" and obstime = '").append(
sdf.get().format(currentHour.getTime()));
query.append("'").append(" order by radid asc, memspan_ind asc");
Object[] results = dao.executeSQLQuery(query.toString());
@ -126,14 +138,14 @@ public class HpeDataAccessor {
rec.setRadarId((String) oa[0]);
rec.setOfficeId((String) oa[1]);
rec.setObsTime((Date) oa[2]);
rec.setMemspanIndex((Integer) oa[3]);
rec.setNumPairs((Float) oa[4]);
rec.setMemspanIndex((Short) oa[3]);
rec.setNumPairs((Double) oa[4]);
rec.setSumGages((Float) oa[5]);
rec.setSumRadars((Float) oa[6]);
rec.setBias((Float) oa[7]);
if (!dataMap.containsKey(rec.getOfficeId())) {
dataMap.put(rec.getOfficeId(),
if (!dataMap.containsKey(rec.getRadarId())) {
dataMap.put(rec.getRadarId(),
new ArrayList<BiasDynRecord>());
}

View file

@ -41,6 +41,7 @@ import com.raytheon.uf.edex.plugin.hpe.util.HpeEnums.HpeDataSource;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 26, 2014 3026 mpduff Initial creation
* Dec 16, 2014 3026 mpduff Add default value if numPairs < npairBiasSelect
*
* </pre>
*
@ -172,7 +173,11 @@ public class HpeLabelGenerator {
sb.append(bias).append(SLASH)
.append((int) rec.getNumPairs());
sb.append(StringUtil.NEWLINE);
return sb.toString();
} else {
sb.append("1.00").append(SLASH)
.append((int) rec.getNumPairs());
sb.append(StringUtil.NEWLINE);
return sb.toString();
}
}

View file

@ -1,5 +1,6 @@
#!/bin/bash
if [ ${#AWIPS_HOME} = 0 ]
then
path_to_script=`readlink -f $0`
@ -8,6 +9,12 @@ fi
. ${AWIPS_HOME}/GFESuite/ServiceBackup/configuration/svcbu.env
if [ ${#IFPS_LOG} = 0 ]
then
echo "ERROR: environment variable IFPS_LOG is undfined, exit."
exit 1
fi
find ${IFPS_LOG}/* -mtime +7 -exec rm -fr {} \; 2>/dev/null

View file

@ -1 +1 @@
0233ff115f56e39de144e929b7a7c87294764982
02af52f6d2dfb339dda7325b41e14e642c68031a

View file

@ -19,6 +19,9 @@ import java.util.List;
* Date Ticket# Engineer Description
* ------- ------- -------- -----------
* 04/23/2012 229 Chin Chen Initial coding
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
*
* </pre>
*
@ -37,9 +40,10 @@ public class NsharpSoundingElementStateProperty {
private int compColorIndex;
private List<NcSoundingLayer> sndLyLst;
private List<NcSoundingLayer> sndLyLstBk;
private boolean goodData = true; //#5929
public NsharpSoundingElementStateProperty(String elementDescription,
String stnDescription,
String timeDescription, NsharpStationInfo stnInfo, List<NcSoundingLayer> sndLyLst) {
String timeDescription, NsharpStationInfo stnInfo, List<NcSoundingLayer> sndLyLst, boolean goodData) {
super();
this.elementDescription = elementDescription;
//this.elementState = elementState;
@ -49,6 +53,7 @@ public class NsharpSoundingElementStateProperty {
this.sndType = stnInfo.getSndType();
this.compColorIndex = NsharpConstants.LINE_COMP1;;
this.sndLyLst = sndLyLst;
this.goodData = goodData; //#5929
sndLyLstBk= new ArrayList<NcSoundingLayer>(sndLyLst.size());
for(NcSoundingLayer ly : sndLyLst){
try {
@ -134,5 +139,13 @@ public class NsharpSoundingElementStateProperty {
}
}
}
public boolean isGoodData() {
return goodData;
}
public void setGoodData(boolean goodData) {
this.goodData = goodData;
}
}

View file

@ -13,7 +13,10 @@
* 05/02/2012 229 Chin Chen Initial coding for multiple display panes implementation
* 03/11/2013 972 Greg Hull rm paneNumber
* 03/11/2013 2491 bsteffen extend IDescriptor derictly for better serialization detection.
* 01/13/2015 DR#17008,
* task#5930 Chin Chen NSHARP Hodograph Does Not Loop in D2D Lite Configuration
* moved "setFrameCoordinator()" from NsharpSkewTPaneDescriptor to here,
* so it can be used by other descriptor
*
* </pre>
*
@ -24,6 +27,7 @@ package gov.noaa.nws.ncep.ui.nsharp.display;
import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpAbstractPaneResource;
import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpResourceHandler;
import gov.noaa.nws.ncep.viz.ui.display.NCLoopProperties;
import java.util.List;
@ -34,15 +38,14 @@ import org.geotools.referencing.crs.DefaultEngineeringCRS;
import com.raytheon.uf.viz.core.PixelExtent;
import com.raytheon.uf.viz.core.datastructure.LoopProperties;
import com.raytheon.uf.viz.core.drawables.FrameCoordinator;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.IFrameCoordinator;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.viz.core.graphing.GraphDescriptor;
@XmlAccessorType(XmlAccessType.NONE)
public class NsharpAbstractPaneDescriptor extends GraphDescriptor implements
IDescriptor {
// @XmlElement
// protected int paneNumber;
protected NsharpResourceHandler rscHandler=null;
@ -53,14 +56,6 @@ public class NsharpAbstractPaneDescriptor extends GraphDescriptor implements
public void setRscHandler(NsharpResourceHandler rscHandler) {
this.rscHandler = rscHandler;
}
// public int getPaneNumber() {
// return paneNumber;
// }
//
// public void setPaneNumber(int paneNumber) {
// this.paneNumber = paneNumber;
// }
public NsharpAbstractPaneDescriptor() {
super();
@ -106,4 +101,64 @@ public class NsharpAbstractPaneDescriptor extends GraphDescriptor implements
e.printStackTrace();
}
}
//DR17008
protected void setFrameCoordinator() {
frameCoordinator = new FrameCoordinator(this) {
@Override
/*
* Chin Note: this function handles keyboard up/down/left/right arrow keys for station and time line stepping.
*/
public void changeFrame(
IFrameCoordinator.FrameChangeOperation operation,
IFrameCoordinator.FrameChangeMode mode) {
if(rscHandler == null)
return;
//System.out.println("NsharpSkewTPaneDescriptor changeFrame(operation) called op="+operation+" mode"+mode);
if(mode == IFrameCoordinator.FrameChangeMode.SPACE_ONLY){
//up/down arrow keys for stepping stations
//editor.getRscHandler().setSteppingStnIdList(operation);
rscHandler.setSteppingStnIdList(operation);
} else if(mode == IFrameCoordinator.FrameChangeMode.TIME_ONLY || mode == IFrameCoordinator.FrameChangeMode.TIME_AND_SPACE){
//left/right arrow keys for stepping time lines
//editor.getRscHandler().setSteppingTimeLine(operation, mode);
rscHandler.setSteppingTimeLine(operation, mode);
}
}
/*
* (non-Javadoc)
* @see com.raytheon.uf.viz.core.drawables.FrameCoordinator#changeFrame(com.raytheon.uf.viz.core.datastructure.LoopProperties)
* This function handling nsharp looping.
* Chin: 12.8.1: let skewtPaneDescriptor handle looping. All other pane descriptor will do nothing. Otherwise, we will looping X times faster when we
* have X number of panes configured and each pane move frame once.
*
*/
@Override
public void changeFrame(LoopProperties loopProperties) {
if(rscHandler == null)
return;
long waitTime = Long.MAX_VALUE;
//System.out.println("NsharpSkewTPaneDescriptor changeFrame(loop) called, loopDirection= "+loopDirection + " fwd="+loopProperties.getFwdFrameTime()+
// " back="+loopProperties.getRevFrameTime() + " 1st dt="+loopProperties.getFirstFrameDwell()+ " lasDt="+loopProperties.getLastFrameDwell());
if(loopProperties.getMode() == LoopProperties.LoopMode.Forward || loopProperties.getMode() == LoopProperties.LoopMode.Cycle)
waitTime = loopProperties.getFwdFrameTime();
else
waitTime = loopProperties.getRevFrameTime();
int frameSize= rscHandler.getTimeElementListSize();
int curFrameIndex = rscHandler.getCurrentTimeElementListIndex();
if(curFrameIndex == 0)
waitTime = loopProperties.getFirstFrameDwell();
else if(curFrameIndex == frameSize-1)
waitTime = loopProperties.getLastFrameDwell();
loopProperties.drawAfterWait(waitTime);
//System.out.println("wait time="+waitTime);
if (loopProperties.isShouldDraw()) {
rscHandler.setLoopingDataTimeLine(loopProperties);
//System.out.println("loopinp step");
}
}
};
}
}

View file

@ -18,6 +18,8 @@ package gov.noaa.nws.ncep.ui.nsharp.display;
* 06/14/2011 11-5 Chin Chen migration
* 03/11/2013 972 Greg Hull rm paneNum and editorNum; rm AbstractNcEditor
* 03/25/2013 972 Greg Hull rm unused Add/RemoveListeners.
* 01/13/2015 DR#17008,
* task#5930 Chin Chen NSHARP Hodograph Does Not Loop in D2D Lite Configuration
*
* </pre>
*
@ -178,7 +180,7 @@ public class NsharpEditor extends AbstractEditor implements
private int futureHeightHint;
private int futureWidthHint;
private String paneConfigurationName;
private IRenderableDisplay[] displayArray;
@ -1382,13 +1384,17 @@ public class NsharpEditor extends AbstractEditor implements
DISPLAY_SPC_GRAPHS = -1;
} else if (paneConfigurationName // d2dlite start
.equals(NsharpConstants.PANE_LITE_D2D_CFG_STR)) {
if (rscHandler != null
&& rscHandler.getCurrentGraphMode() == NsharpConstants.GRAPH_HODO) {
DISPLAY_HODO = 0;
//5930
NsharpPaletteWindow win = NsharpPaletteWindow.getInstance();
if (win != null &&
win.getCurrentGraphMode() == NsharpConstants.GRAPH_HODO) {
//#5930if (rscHandler != null
// && rscHandler.getCurrentGraphMode() == NsharpConstants.GRAPH_HODO) {
DISPLAY_HODO = 0 ;
DISPLAY_TIMESTN = DISPLAY_HODO + 1;
DISPLAY_SKEWT = -1;
} else {
DISPLAY_SKEWT = 0;
DISPLAY_SKEWT = 0;
DISPLAY_TIMESTN = DISPLAY_SKEWT + 1;
DISPLAY_HODO = -1;
}
@ -1459,8 +1465,12 @@ public class NsharpEditor extends AbstractEditor implements
// d2dlite start
} else if (paneConfigurationName
.equals(NsharpConstants.PANE_LITE_D2D_CFG_STR)) {
if (rscHandler != null
&& rscHandler.getCurrentGraphMode() == NsharpConstants.GRAPH_HODO) {
//5930
NsharpPaletteWindow win = NsharpPaletteWindow.getInstance();
if (win != null &&
win.getCurrentGraphMode() == NsharpConstants.GRAPH_HODO) {
//#5930 if (rscHandler != null
//&& rscHandler.getCurrentGraphMode() == NsharpConstants.GRAPH_HODO) {
displayArray[DISPLAY_HODO] = new NsharpHodoPaneDisplay(
new PixelExtent(NsharpConstants.HODO_DISPLAY_REC),
DISPLAY_HODO);
@ -1610,9 +1620,11 @@ public class NsharpEditor extends AbstractEditor implements
nsharpComp = new Composite[DISPLAY_TOTAL];
displayPane = new VizDisplayPane[DISPLAY_TOTAL];
EditorInput edInput = new EditorInput(new NCLoopProperties(),
//EditorInput edInput = new EditorInput(new NsharpLoopProperties(),
// displayArray);
//CHIN task#5930 use same loop properties
EditorInput edInput = new EditorInput(this.editorInput.getLoopProperties(),
displayArray);
this.setInput(edInput);
this.displaysToLoad = displayArray;
for (IRenderableDisplay display : displayArray) {
@ -2130,4 +2142,10 @@ public class NsharpEditor extends AbstractEditor implements
// +
// pane.toString()+" newRenderableDisplay="+newRenderableDisplay.toString());
}
public String getPaneConfigurationName() {
return paneConfigurationName;
}
}

View file

@ -11,6 +11,8 @@
* Date Ticket# Engineer Description
* ------- ------- -------- -----------
* 05/02/2012 229 Chin Chen Initial coding for multiple display panes implementation
* 01/13/2015 DR#17008,
* task#5930 Chin Chen NSHARP Hodograph Does Not Loop in D2D Lite Configuration
*
* </pre>
*
@ -19,7 +21,9 @@
*/
package gov.noaa.nws.ncep.ui.nsharp.display;
import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants;
import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpHodoPaneResource;
import gov.noaa.nws.ncep.viz.common.ui.NmapCommon;
import java.util.List;
@ -28,19 +32,36 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import com.raytheon.uf.viz.core.PixelExtent;
import com.raytheon.uf.viz.core.drawables.IFrameCoordinator;
import com.raytheon.uf.viz.d2d.core.time.D2DTimeMatcher;
import com.raytheon.viz.ui.perspectives.VizPerspectiveListener;
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "nsharpHodoPaneDescriptor")
public class NsharpHodoPaneDescriptor extends NsharpAbstractPaneDescriptor {
public NsharpHodoPaneDescriptor(PixelExtent pe) {
super(pe);
//System.out.println("NsharpHodoPaneDescriptor created " + this.toString());
if((NsharpEditor.getActiveNsharpEditor() != null) && (NsharpEditor.getActiveNsharpEditor().getPaneConfigurationName().equals(NsharpConstants.PANE_LITE_D2D_CFG_STR)))
{
setTimeMatcher(new D2DTimeMatcher());
setFrameCoordinator();
}
}
public NsharpHodoPaneDescriptor(PixelExtent pe, int paneNumber) {
super(pe, paneNumber);
if((NsharpEditor.getActiveNsharpEditor() != null) && (NsharpEditor.getActiveNsharpEditor().getPaneConfigurationName().equals(NsharpConstants.PANE_LITE_D2D_CFG_STR)))
{
setTimeMatcher(new D2DTimeMatcher());
setFrameCoordinator();
}
}
public NsharpHodoPaneDescriptor() {
super();
if((NsharpEditor.getActiveNsharpEditor() != null) && (NsharpEditor.getActiveNsharpEditor().getPaneConfigurationName().equals(NsharpConstants.PANE_LITE_D2D_CFG_STR)))
{
setTimeMatcher(new D2DTimeMatcher());
setFrameCoordinator();
}
}
public NsharpHodoPaneResource getHodoResource() {
List<NsharpHodoPaneResource> list = resourceList
@ -50,5 +71,35 @@ public class NsharpHodoPaneDescriptor extends NsharpAbstractPaneDescriptor {
}
return null;
}
@SuppressWarnings("deprecation")
@Override
/*
* Chin Note: this function handles time line stepping from NC Perspective tool bar left/right/first/last arrow Buttons.
*/
public void changeFrame(FrameChangeOperation operation, FrameChangeMode mode) {
synchronized (this) {
//Chin Note: there are multiple (6) panes.
//We only need to step one timeline. Therefore, we handle stepping by skewt pane.
//However, for D2D LITE display configuration, when switched to HODO pane, skewT pane is no longer
//in charge. therefore, we have to handle this special case here by HODO pane.
if((rscHandler == null) ||(!rscHandler.getPaneConfigurationName().equals(NsharpConstants.PANE_LITE_D2D_CFG_STR)))
return;
if( VizPerspectiveListener.getCurrentPerspectiveManager()!= null){
//System.out.println("changeFrame: current perspective ="+VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId());
if(!VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId().equals(NmapCommon.NatlCntrsPerspectiveID)){
if(mode != FrameChangeMode.TIME_ONLY)
return;
}
}
// we will have to do conversion here
IFrameCoordinator.FrameChangeOperation dop = IFrameCoordinator.FrameChangeOperation.valueOf(operation.name());
IFrameCoordinator.FrameChangeMode dmode = IFrameCoordinator.FrameChangeMode.valueOf(mode.name());
rscHandler.setSteppingTimeLine(dop, dmode);
}
}
}

View file

@ -11,6 +11,10 @@
* Date Ticket# Engineer Description
* ------- ------- -------- -----------
* 05/02/2012 229 Chin Chen Initial coding for multiple display panes implementation
* 01/13/2015 DR#17008,
* task#5930 Chin Chen NSHARP Hodograph Does Not Loop in D2D Lite Configuration
* moved "setFrameCoordinator()" to NsharpAbstractPaneDescriptor,
* so it can be used by other descriptor
*
* </pre>
*
@ -29,8 +33,6 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import com.raytheon.uf.viz.core.PixelExtent;
import com.raytheon.uf.viz.core.datastructure.LoopProperties;
import com.raytheon.uf.viz.core.drawables.FrameCoordinator;
import com.raytheon.uf.viz.core.drawables.IFrameCoordinator;
import com.raytheon.uf.viz.d2d.core.time.D2DTimeMatcher;
import com.raytheon.viz.ui.perspectives.VizPerspectiveListener;
@ -54,69 +56,7 @@ public class NsharpSkewTPaneDescriptor extends NsharpAbstractPaneDescriptor {
setTimeMatcher(new D2DTimeMatcher());
setFrameCoordinator();
}
private void setFrameCoordinator() {
frameCoordinator = new FrameCoordinator(this) {
@Override
/*
* Chin Note: this function handles keyboard up/down/left/right arrow keys for station and time line stepping.
*/
public void changeFrame(
IFrameCoordinator.FrameChangeOperation operation,
IFrameCoordinator.FrameChangeMode mode) {
//NsharpEditor editor = NsharpEditor.getActiveNsharpEditor() ;
//if(editor== null || editor.getRscHandler()==null)
// return;
if(rscHandler == null)
return;
//System.out.println("NsharpSkewTPaneDescriptor changeFrame(operation) called op="+operation+" mode"+mode);
if(mode == IFrameCoordinator.FrameChangeMode.SPACE_ONLY){
//up/down arrow keys for stepping stations
//editor.getRscHandler().setSteppingStnIdList(operation);
rscHandler.setSteppingStnIdList(operation);
} else if(mode == IFrameCoordinator.FrameChangeMode.TIME_ONLY || mode == IFrameCoordinator.FrameChangeMode.TIME_AND_SPACE){
//left/right arrow keys for stepping time lines
//editor.getRscHandler().setSteppingTimeLine(operation, mode);
rscHandler.setSteppingTimeLine(operation, mode);
}
}
/*
* (non-Javadoc)
* @see com.raytheon.uf.viz.core.drawables.FrameCoordinator#changeFrame(com.raytheon.uf.viz.core.datastructure.LoopProperties)
* This function handling nsharp looping.
* Chin: 12.8.1: let skewtPaneDescriptor handle looping. All other pane descriptor will do nothing. Otherwise, we will looping X times faster when we
* have X number of panes configured and each pane move frame once.
*
*/
@Override
public void changeFrame(LoopProperties loopProperties) {
if(rscHandler == null)
return;
long waitTime = Long.MAX_VALUE;
//System.out.println("NsharpSkewTPaneDescriptor changeFrame(loop) called, loopDirection= "+loopDirection + " fwd="+loopProperties.getFwdFrameTime()+
// " back="+loopProperties.getRevFrameTime() + " 1st dt="+loopProperties.getFirstFrameDwell()+ " lasDt="+loopProperties.getLastFrameDwell());
if(loopProperties.getMode() == LoopProperties.LoopMode.Forward || loopProperties.getMode() == LoopProperties.LoopMode.Cycle)
waitTime = loopProperties.getFwdFrameTime();
else
waitTime = loopProperties.getRevFrameTime();
int frameSize= rscHandler.getTimeElementListSize();
int curFrameIndex = rscHandler.getCurrentTimeElementListIndex();
if(curFrameIndex == 0)
waitTime = loopProperties.getFirstFrameDwell();
else if(curFrameIndex == frameSize-1)
waitTime = loopProperties.getLastFrameDwell();
loopProperties.drawAfterWait(waitTime);
if (loopProperties.isShouldDraw()) {
rscHandler.setLoopingDataTimeLine(loopProperties);
}
}
};
}
public NsharpSkewTPaneResource getSkewtResource() {
public NsharpSkewTPaneResource getSkewtResource() {
List<NsharpSkewTPaneResource> list = resourceList
.getResourcesByTypeAsType(NsharpSkewTPaneResource.class);
if (list != null && !list.isEmpty()) {

View file

@ -13,6 +13,9 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc;
* 04/23/2012 229 Chin Chen Initial coding
* 04/23/2014 Chin Chen Add d2d lite page
* 08/11/2014 Chin Chen fix typo
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
*
* </pre>
*
@ -60,7 +63,8 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
// number of this page. index 0
// point to a dummy.
private static final String NO_DATA = "NO VALID DATA AVAILABLE";
private static final String NO_DATA = "NO VALID DATA AVAILABLE FOR THIS PAGE";
private static final String INSUFFICIENT_DATA = "INSUFFICIENT DATA FOR PARAMETERS COMPUTATION";
// private double charHeight = NsharpConstants.CHAR_HEIGHT_;
private double curY;
@ -160,7 +164,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
handleResize();
}
if ((soundingLys != null) && (soundingLys.size() >= 4)) {
if ((soundingLys != null) && (rscHandler.isGoodData())) {//#5929
this.defaultFont.setSmoothing(false);
this.defaultFont.setScaleFont(false);
// write to panels
@ -187,6 +191,9 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
}
}
}
else { //#5929
drawInsuffDataMessage(target, panelRectArray[0]);
}
}
@Override
@ -239,6 +246,28 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
super.resetData(soundingLys, prevsoundingLys);
currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE;
}
@SuppressWarnings("deprecation") //#5929
private void drawInsuffDataMessage(IGraphicsTarget target, Rectangle rect)
throws VizException {
IFont myfont;
if (paneConfigurationName.equals(NsharpConstants.PANE_LITE_D2D_CFG_STR))
myfont = font9;
else
myfont = font20;
defineCharHeight(myfont);
myfont.setSmoothing(false);
myfont.setScaleFont(false);
sumP1Visible = true;
extent = new PixelExtent(rect);
target.setupClippingPlane(extent);
target.drawString(myfont, INSUFFICIENT_DATA, rect.x,
rect.y, 0.0, TextStyle.NORMAL, NsharpConstants.color_cyan,
HorizontalAlignment.LEFT, VerticalAlignment.TOP, null);
return;
}
private void drawPanel(IGraphicsTarget target, int pageOrderNumber,
int dsiplayPanelNumber) throws VizException {
@ -344,7 +373,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
// if we can not Interpolates a temp with 700 mb pressure, then we dont
// have enough raw data
if ((nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0)) {
target.drawString(myfont, " " + NO_DATA, rect.x,
target.drawString(myfont, NO_DATA, rect.x,
rect.y, 0.0, TextStyle.NORMAL, NsharpConstants.color_cyan,
HorizontalAlignment.LEFT, VerticalAlignment.TOP, null);
return;
@ -1053,7 +1082,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
// if we can not Interpolates a temp with 700 mb pressure, then we dont
// have enough raw data
if (nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0) {
target.drawString(myfont, " " + NO_DATA, rect.x,
target.drawString(myfont,NO_DATA, rect.x,
rect.y, 0.0, TextStyle.NORMAL, NsharpConstants.color_cyan,
HorizontalAlignment.LEFT, VerticalAlignment.TOP, null);
return;
@ -3749,7 +3778,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource {
// if we can not Interpolates a temp with 700 mb pressure, then we dont
// have enough raw data
if ((nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0)) {
target.drawString(myfont, " " + NO_DATA, rect.x,
target.drawString(myfont, NO_DATA, rect.x,
rect.y, 0.0, TextStyle.NORMAL, NsharpConstants.color_cyan,
HorizontalAlignment.LEFT, VerticalAlignment.TOP, null);
return;

View file

@ -10,6 +10,9 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc;
* Date Ticket# Engineer Description
* ------- ------- -------- -----------
* 04/23/2012 229 Chin Chen Initial coding
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
*
* </pre>
*
@ -127,7 +130,7 @@ public class NsharpHodoPaneResource extends NsharpAbstractPaneResource{
hodoWindRscShapeList.add(shNcolor);
}
float surfaceLevel = soundingLays.get(0).getGeoHeight(); //#5929
for (NcSoundingLayer layer : soundingLays){
if(layer.getPressure() < 100 || layer.getWindSpeed() <0)
continue;
@ -138,15 +141,15 @@ public class NsharpHodoPaneResource extends NsharpAbstractPaneResource{
double [][] lines = {{world.mapX(c0.x), world.mapY(c0.y)},{world
.mapX(c1.x), world.mapY(c1.y)}};
if(incolor == null){
if(layer.getGeoHeight() <nsharpNative.nsharpLib.msl(3000)){
//red
//use MSL here, so Converts height from (meters) AGL to MSL. #5929
if(layer.getGeoHeight() < (3000+surfaceLevel)){
shapeR.addLineSegment(lines);
}
else if(layer.getGeoHeight() < nsharpNative.nsharpLib.msl(6000))
else if(layer.getGeoHeight() < (6000+surfaceLevel))
shapeG.addLineSegment(lines);
else if(layer.getGeoHeight() < nsharpNative.nsharpLib.msl(9000))
else if(layer.getGeoHeight() < (9000+surfaceLevel))
shapeY.addLineSegment(lines);
else if(layer.getGeoHeight() < nsharpNative.nsharpLib.msl(12000))
else if(layer.getGeoHeight() < (12000+surfaceLevel))
shapeC.addLineSegment(lines);
else
shapeV.addLineSegment(lines);
@ -177,6 +180,7 @@ public class NsharpHodoPaneResource extends NsharpAbstractPaneResource{
}
hodoWindRscShapeList.clear();
}
world = hodoBackground.computeWorld();
boolean compareStnIsOn = rscHandler.isCompareStnIsOn();
int currentTimeListIndex = rscHandler.getCurrentTimeElementListIndex();
@ -575,7 +579,7 @@ public class NsharpHodoPaneResource extends NsharpAbstractPaneResource{
return;
hodoBackground.paintInternal(target, paintProps);
if((soundingLys != null) && (soundingLys.size()>= 4))
if((soundingLys != null) && (soundingLys.size()> 2) )
{
this.font10.setSmoothing(false);
this.font10.setScaleFont(false);
@ -602,13 +606,11 @@ public class NsharpHodoPaneResource extends NsharpAbstractPaneResource{
}
target.clearClippingPlane();
if(cursorInHodo){
drawHodoDynamicData(target, currentZoomLevel);
}
}
}
@Override

View file

@ -10,6 +10,9 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc;
* Date Ticket# Engineer Description
* ------- ------- -------- -----------
* 04/23/2012 229 Chin Chen Initial coding
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
*
* </pre>
*
@ -181,7 +184,7 @@ public class NsharpInsetPaneResource extends NsharpAbstractPaneResource{
//Chin, since we only display 4 insets and their backgrounds have same size, only draws 4 backgrounds.
//psblWatchTypeBackground.paint(target, paintProps);
//thetaEPresureBackground.paint(target, paintProps);
if((soundingLys != null) && (soundingLys.size()>= 4))
if((soundingLys != null) && rscHandler.isGoodData()) //#5929)
{
this.font10.setSmoothing(false);
this.font10.setScaleFont(false);
@ -294,7 +297,7 @@ public class NsharpInsetPaneResource extends NsharpAbstractPaneResource{
return;
//System.out.println("createRscWireFrameShapes called");
disposeInsetWireFrameShapes();
if(soundingLys != null){
if(soundingLys != null && rscHandler.isGoodData()){ //#5929
WGraphics WGc= thetaEPresureBackground.getWorld();
createRscThetaEPressureShape(WGc);

View file

@ -14,6 +14,10 @@
* 01/13/2014 Chin Chen TTR829- when interpolation, edit graph is allowed
* 02/03/2014 1106 Chin Chen Need to be able to use clicking on the Src,Time, or StnId to select display
* 08/12/2014 Chin Chen fixed issue that "load archive file with wrong time line displayed"
* 12/04/2014 DR16888 Chin Chen fixed issue that "Comp(Src) button not functioning properly in NSHARP display"
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
* </pre>
*
* @author Chin Chen
@ -160,6 +164,8 @@ public class NsharpResourceHandler {
private int[] pageDisplayOrderNumberArray = new int[NsharpConstants.PAGE_MAX_NUMBER + 1];
//#5929
private boolean goodData=false;
// index is the real page defined in NsharpConstants to be shown, value is
// the order number of this page.
// index 0 point to a dummy.
@ -187,7 +193,7 @@ public class NsharpResourceHandler {
private int currentSoundingLayerIndex = 0;
private int hodoEditingSoundingLayerIndex = 0;
private boolean plotInteractiveTemp = false;
private Coordinate interactiveTempPointCoordinate;
@ -575,11 +581,12 @@ public class NsharpResourceHandler {
* The following code is to create a list of stns within the range
* of user defined radius (minimum distance) to "current" station
* and also has data loaded with same time line as "current" time
* line. Note that we have two time line formats, yymmdd/hh(day)Vxxx
* and yymmdd/hh(day). A same time line is compared by yymmdd/hh
* line. Note that we have two time line formats, MM.DDVxxx(day)
* and MM.DD(day). A same time line is compared by MM.DD
* only. All qualified stations, including current station, found
* will be listed and used for SND comparison.
*/
String TIME_COMPARE_STRING = "MM.DD";
compSndSelectedElemList.clear();
// CompSndSelectedElem curStnTimeIndexCouple = new
// CompSndSelectedElem(currentStnElementListIndex,currentTimeElementListIndex,currentSndElementListIndex);
@ -593,7 +600,12 @@ public class NsharpResourceHandler {
.get(currentSndElementListIndex).getStnInfo();
gc.setStartingGeographicPoint(currentStnInfo.getLongitude(),
currentStnInfo.getLatitude());
int timeLineLengthToComp = "yymmdd/hh".length();
// String curTimeString = timeElementList.get(currentTimeElementListIndex).getElementDescription();
int timeLineLengthToComp = TIME_COMPARE_STRING.length();
String currentTimeLineToComp = timeElementList
.get(currentTimeElementListIndex).getElementDescription()
.substring(0, timeLineLengthToComp);
@ -974,6 +986,7 @@ public class NsharpResourceHandler {
if (skewtPaneRsc != null)
skewtPaneRsc
.setCurrentSkewTEditMode(NsharpConstants.SKEWT_EDIT_MODE_EDITPOINT);
elem.setGoodData(checkDataIntegrity(soundingLys));//#5929
resetData();
}
@ -986,7 +999,12 @@ public class NsharpResourceHandler {
// update active sounding layer and picked stn info
// re-populate snd data to nsharp native code lib for later calculating
nsharpNative.populateSndgData(soundingLys);
//#5929 dont populate sounding data if data is bad
if(getCurSoundingElementStateProperty()!=null)
goodData= getCurSoundingElementStateProperty().isGoodData();
if(goodData)
nsharpNative.populateSndgData(soundingLys);
if (skewtPaneRsc != null)
skewtPaneRsc.resetData(soundingLys, previousSoundingLys);
@ -1006,7 +1024,7 @@ public class NsharpResourceHandler {
// if soundingLys is null, then we stop here, after reset data.
if (soundingLys == null)
return;
if (soundingLys.size() > 0) {
if (soundingLys.size() > 0 && (goodData)) {
// set initial hodohouseC
// ----- set hodo circle at Bunkers Right, Chin according to TTR6065
@ -1037,11 +1055,7 @@ public class NsharpResourceHandler {
* that really meant to reset parcel type.
*/
}
// Chin: TBD remove handle resize here to fix sizing issue when swapped
// nsharp from side pane back to main pane
// but, may cause other problem?
// if(skewtPaneRsc!=null)
// skewtPaneRsc.handleResize();
if (skewtPaneRsc != null)
skewtPaneRsc.createRscWireFrameShapes();
if (hodoPaneRsc != null)
@ -1050,7 +1064,7 @@ public class NsharpResourceHandler {
insetPaneRsc.createInsetWireFrameShapes();
if (witoPaneRsc != null)
witoPaneRsc.createAllWireFrameShapes();
if (spcGraphsPaneRsc != null) {
if (spcGraphsPaneRsc != null && (goodData) ){//#5929
// Chin: SPC graphs performance concern, as it need to call get
// info functions from bigSharo.so and cause long delay.
// Therefore, do it once only when reset data.
@ -1170,7 +1184,7 @@ public class NsharpResourceHandler {
private void addElementToTableAndLists(String stnId_timeLine_sndType,
String stnId, String tmLine, String sndType,
NsharpStationInfo stnInfo, List<NcSoundingLayer> sndLyLst) {
NsharpStationInfo stnInfo, List<NcSoundingLayer> sndLyLst, boolean goodData) {
// System.out.println("stn to be added "+ stnId + " timeline "+tmLine);
NsharpSoundingElementStateProperty newSndPropElem = null;
int tmIndex = getIndexFromElementList(tmLine, timeElementList);
@ -1190,7 +1204,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData); //#5929
stnTimeSndTable.get(stnIndex).get(tmIndex)
.set(sndTpyeIndex, newSndPropElem);
}
@ -1207,7 +1221,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
stnTimeSndTable.get(currentStnElementListIndex)
.get(currentTimeElementListIndex)
.set(currentSndElementListIndex, newSndPropElem);
@ -1224,7 +1238,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
stnTimeSndTable.get(currentStnElementListIndex)
.get(currentTimeElementListIndex)
.set(currentSndElementListIndex, newSndPropElem);
@ -1246,7 +1260,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
stnTimeSndTable.get(currentStnElementListIndex)
.get(currentTimeElementListIndex)
.set(currentSndElementListIndex, newSndPropElem);
@ -1267,7 +1281,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
stnTimeSndTable.get(currentStnElementListIndex)
.get(currentTimeElementListIndex)
.set(currentSndElementListIndex, newSndPropElem);
@ -1289,7 +1303,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
stnTimeSndTable.get(currentStnElementListIndex)
.get(currentTimeElementListIndex)
.set(currentSndElementListIndex, newSndPropElem);
@ -1314,7 +1328,7 @@ public class NsharpResourceHandler {
// NsharpSoundingElementStateProperty object
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
stnTimeSndTable.get(currentStnElementListIndex)
.get(currentTimeElementListIndex)
.set(currentSndElementListIndex, newSndPropElem);
@ -1350,7 +1364,7 @@ public class NsharpResourceHandler {
// one new loaded sounding data
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId,
tmLine, stnInfo, sndLyLst);
tmLine, stnInfo, sndLyLst,goodData);
sndlistForTm.add(newSndPropElem);
} else {
@ -1398,7 +1412,7 @@ public class NsharpResourceHandler {
newSndPropElem = new NsharpSoundingElementStateProperty(
stnId_timeLine_sndType, stnId, tmLine, stnInfo,
sndLyLst);
sndLyLst,goodData);
newList.add(newSndPropElem);
newListList.add(newList);
stnTimeSndTable.add(newListList);
@ -1855,6 +1869,21 @@ public class NsharpResourceHandler {
*
* }
*/
//task#5929
private boolean checkDataIntegrity(List<NcSoundingLayer> sndLayers){
boolean gooddata = false;
int numberOfTemp=0;
int numberOfGoodDewPt=0;
for(NcSoundingLayer layer: sndLayers){
if(layer.getTemperature() > -999)
numberOfTemp++;
if(layer.getDewpoint() > -999)
numberOfGoodDewPt++;
}
if(numberOfGoodDewPt >= 2 && numberOfTemp>=2)
gooddata=true;
return gooddata;
}
// This api peforms real load data function
private void addRsc(boolean displayNewData,
@ -1862,15 +1891,15 @@ public class NsharpResourceHandler {
NsharpStationInfo stnInfo, boolean fromArchive) {
// // testing code // stnInfo.setStnId("KUKI");
// Set<String> keysettest = new HashSet<String>(soundMap.keySet());
// for (String key : keysettest) {
// List<NcSoundingLayer> sndLy = soundMap.remove(key); // String
// Set<String> keysettest = new HashSet<String>(soundMap.keySet());
// for (String key : keysettest) {
// List<NcSoundingLayer> sndLy = soundMap.remove(key); // String
// // newkey=
// // key.replace("NCUAIR", "gpduair"); // String newkey =
// // key.replace("NAMS", "SSS");
// String newkey = key.replace("140303/12", "120109/12");
// soundMap.put(newkey, sndLy);
// } //
// String newkey =key.replace("NCUAIR", "gpduair"); // String newkey =
// String newkey= key.replace("NAMS", "SSS");
// String newkey = key.replace("130925/17(Wed)V017", "131001/00(Thu)V000");
// soundMap.put(newkey, sndLy);
// }
// // stnInfo.setSndType(stnInfo.getSndType().replace("NCUAIR", //
// // "gpduair")); // stnInfo.setSndType(stnInfo.getSndType().replace(
// // "NAMS","SSS"));
@ -1924,9 +1953,15 @@ public class NsharpResourceHandler {
// based on this KEY string format "KGRI 100616/03(Wed)Vxxx GFSSND"
String stnId, sndType, timeLine, timeLine_sndType, stnId_timeLine_sndType;
List<NcSoundingLayer> sndLyLst;
try {
stnId_timeLine_sndType = tempTimeLineArr[i].toString();
if(stnId_timeLine_sndType.equals("N/A"))
{
continue;
}
sndLyLst = soundMap.get(stnId_timeLine_sndType);
stnId = stnId_timeLine_sndType.substring(0,
stnId_timeLine_sndType.indexOf(" "));
timeLine_sndType = stnId_timeLine_sndType
@ -2015,8 +2050,10 @@ public class NsharpResourceHandler {
// No more needed? timeLine = timeLine.replace(" ", "-"); //fixed
// DR15325 - sorting time line issue in D2D
// add time line to stnTimeTable and set its index
//task#5929
boolean goodData = checkDataIntegrity( sndLyLst);
addElementToTableAndLists(stnId_timeLine_sndType, stnId, timeLine,
sndType, stnInfo, sndLyLst);
sndType, stnInfo, sndLyLst, goodData);
}
if (displayNewData) {
// Set default parcel trace data
@ -4027,7 +4064,13 @@ public class NsharpResourceHandler {
// re-populate snd data to nsharp native code lib for later calculating
Collections.sort(soundingLys,
NsharpDataHandling.reversePressureHeightWindComparator());
nsharpNative.populateSndgData(soundingLys);
//#5929
goodData = checkDataIntegrity( soundingLys);
if(getCurSoundingElementStateProperty()!=null){
getCurSoundingElementStateProperty().setGoodData(goodData);
}
if(goodData)
nsharpNative.populateSndgData(soundingLys);
// get storm motion wind data after populate sounding from NsharpLib
// refresh test area if it is shown now
NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess();
@ -4053,6 +4096,13 @@ public class NsharpResourceHandler {
}
if (dataPaneRsc != null)
dataPaneRsc.setSoundingLys(soundingLys);
if (spcGraphsPaneRsc != null && (goodData) ){//#5929
// Chin: SPC graphs performance concern, as it need to call get
// info functions from bigSharo.so and cause long delay.
// Therefore, do it once only when reset data.
spcGraphsPaneRsc.getSpcGraphsInfo();
}
}
public void addNewLayer(float tp, float dp, float ws, float wd,
@ -4070,7 +4120,13 @@ public class NsharpResourceHandler {
// re-populate snd data to nsharp native code lib for later calculating
Collections.sort(soundingLys,
NsharpDataHandling.reversePressureHeightWindComparator());
nsharpNative.populateSndgData(soundingLys);
//#5929
goodData = checkDataIntegrity( soundingLys);
if(getCurSoundingElementStateProperty()!=null){
getCurSoundingElementStateProperty().setGoodData(goodData);
}
if(goodData)
nsharpNative.populateSndgData(soundingLys);
// get storm motion wind data after populate sounding from NsharpLib
// refresh text area if it is shown now
NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess();
@ -4096,6 +4152,12 @@ public class NsharpResourceHandler {
}
if (dataPaneRsc != null)
dataPaneRsc.setSoundingLys(soundingLys);
if (spcGraphsPaneRsc != null && (goodData) ){//#5929
// Chin: SPC graphs performance concern, as it need to call get
// info functions from bigSharo.so and cause long delay.
// Therefore, do it once only when reset data.
spcGraphsPaneRsc.getSpcGraphsInfo();
}
}
public void setGraphConfigProperty(NsharpGraphProperty graphConfigProperty) {
@ -4424,4 +4486,9 @@ public class NsharpResourceHandler {
refreshPane();
return true;
}
//#5929
public boolean isGoodData() {
return goodData;
}
}

View file

@ -14,6 +14,9 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc;
* May 08, 2013 1847 bsteffen Allow painting with no Wind Data.
* 02/03/2014 1106 Chin Chen Need to be able to use clicking on the Src,Time, or StnId to select display
* 08/04/2014 Chin Chen fixed effective level line drawing, height marker drawing
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
*
* </pre>
*
@ -1739,6 +1742,8 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource {
// box
}
target.drawStrings(str, latlonstr);
if(wwTypeColor == null)
wwTypeColor = NsharpConstants.color_gold;
target.drawRect(boxExt, wwTypeColor, 2f, 1f); // box border line colored
// with "Psbl Watch Type"
// color
@ -1767,7 +1772,7 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource {
// to check a scenario that sounding data is removed while
// thread is locked
if (soundingLys == null
|| (soundingLys != null && soundingLys.size() <= 0)) {
|| (soundingLys != null && soundingLys.size() < 2)) {
reentryLock.unlock();
return;
}
@ -1778,7 +1783,7 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource {
} else if (justBackToMainPane) {
reentryLock.lock();
if (soundingLys == null
|| (soundingLys != null && soundingLys.size() <= 0)) {
|| (soundingLys != null && soundingLys.size() < 2)) {
reentryLock.unlock();
return;
}
@ -1827,376 +1832,384 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource {
this.font12.setScaleFont(false);
// nsharpNative.populateSndgData(soundingLys);
if (currentGraphMode == NsharpConstants.GRAPH_SKEWT) {
target.setupClippingPlane(pe);
// plot temp curve, when constructing pressureTempRscShapeList,
// it already considered
// comparison, overlay, etc..so, just draw it.
for (NsharpShapeAndLineProperty shapeNLp : pressureTempRscShapeList) {
target.drawWireframeShape(shapeNLp.getShape(), shapeNLp
.getLp().getLineColor(), shapeNLp.getLp()
.getLineWidth(), shapeNLp.getLp().getLineStyle(),
font10);// commonLinewidth*2,commonLineStyle,font10);
}
// plot real temp parcel trace, when constructing
// parcelRtShapeList, it already considered
// comparison, overlay, etc..so, just draw it.
// color is following comparison/overlay lines' configuration.
// line width and line style are following parcel line
// configuration
if (graphConfigProperty.isParcel() == true) {
NsharpLineProperty parcelLp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]);
for (NsharpShapeAndLineProperty shapeNLp : parcelRtShapeList) {
target.drawWireframeShape(shapeNLp.getShape(), shapeNLp
.getLp().getLineColor(), parcelLp
.getLineWidth(), parcelLp.getLineStyle(),
font10);// commonLinewidth*2,commonLineStyle,font10);
}
}
boolean compareStnIsOn = rscHandler.isCompareStnIsOn();
boolean compareSndIsOn = rscHandler.isCompareSndIsOn();
boolean compareTmIsOn = rscHandler.isCompareTmIsOn();
boolean editGraphOn = rscHandler.isEditGraphOn();
boolean overlayIsOn = rscHandler.isOverlayIsOn();
if (graphConfigProperty != null) {
if (graphConfigProperty.isTemp() == true && !compareStnIsOn
&& !compareTmIsOn) {
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_red, TEMP_TYPE,
this.soundingLys);
}
// dew point curve
if (graphConfigProperty.isDewp() == true && !compareStnIsOn
&& !compareTmIsOn) {
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_green, DEWPOINT_TYPE,
this.soundingLys);
}
// plot wet bulb trace
if (graphConfigProperty.isWetBulb() == true
&& !compareStnIsOn && !compareTmIsOn) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WETBULB]);
target.drawWireframeShape(wetBulbTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
// plot virtual temperature trace
if (graphConfigProperty.isVTemp() == true
&& !compareStnIsOn && !compareTmIsOn) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_VIRTUAL_TEMP]);
target.drawWireframeShape(vtempTraceCurveRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
// virtual temperature parcel trace curve
if (graphConfigProperty.isParcelTv() == true
&& !compareStnIsOn && !compareTmIsOn
&& !overlayIsOn) {
if (soundingLys.size() > 0) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_TV]);
target.drawWireframeShape(parcelVtTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
}
if (graphConfigProperty.isDcape() == true
&& dacpeTraceRscShape != null && !compareStnIsOn
&& !compareTmIsOn && !overlayIsOn) {
if (soundingLys.size() > 0) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_DCAPE]);
target.drawWireframeShape(dacpeTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
target.setupClippingPlane(pe);
// plot temp curve, when constructing pressureTempRscShapeList,
// it already considered
// comparison, overlay, etc..so, just draw it.
for (NsharpShapeAndLineProperty shapeNLp : pressureTempRscShapeList) {
target.drawWireframeShape(shapeNLp.getShape(), shapeNLp
.getLp().getLineColor(), shapeNLp.getLp()
.getLineWidth(), shapeNLp.getLp().getLineStyle(),
font10);// commonLinewidth*2,commonLineStyle,font10);
}
// plot real temp parcel trace, when constructing
// parcelRtShapeList, it already considered
// comparison, overlay, etc..so, just draw it.
// color is following comparison/overlay lines' configuration.
// line width and line style are following parcel line
// configuration
if (graphConfigProperty.isParcel() == true && rscHandler.isGoodData()) { //#5929
NsharpLineProperty parcelLp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]);
for (NsharpShapeAndLineProperty shapeNLp : parcelRtShapeList) {
target.drawWireframeShape(shapeNLp.getShape(), shapeNLp
.getLp().getLineColor(), parcelLp
.getLineWidth(), parcelLp.getLineStyle(),
font10);// commonLinewidth*2,commonLineStyle,font10);
}
}
boolean compareStnIsOn = rscHandler.isCompareStnIsOn();
boolean compareSndIsOn = rscHandler.isCompareSndIsOn();
boolean compareTmIsOn = rscHandler.isCompareTmIsOn();
boolean editGraphOn = rscHandler.isEditGraphOn();
boolean overlayIsOn = rscHandler.isOverlayIsOn();
if (graphConfigProperty != null) {
if (graphConfigProperty.isTemp() == true && !compareStnIsOn
&& !compareTmIsOn) {
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_red, TEMP_TYPE,
this.soundingLys);
}
// dew point curve
if (graphConfigProperty.isDewp() == true && !compareStnIsOn
&& !compareTmIsOn) {
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_green, DEWPOINT_TYPE,
this.soundingLys);
}
// plot wet bulb trace
if (graphConfigProperty.isWetBulb() == true && rscHandler.isGoodData() //#5929
&& !compareStnIsOn && !compareTmIsOn) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WETBULB]);
target.drawWireframeShape(wetBulbTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
// plot virtual temperature trace
if (graphConfigProperty.isVTemp() == true && rscHandler.isGoodData() //#5929
&& !compareStnIsOn && !compareTmIsOn) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_VIRTUAL_TEMP]);
target.drawWireframeShape(vtempTraceCurveRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
// virtual temperature parcel trace curve
if (graphConfigProperty.isParcelTv() == true && rscHandler.isGoodData() //#5929
&& !compareStnIsOn && !compareTmIsOn
&& !overlayIsOn) {
if (soundingLys.size() > 0) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_TV]);
target.drawWireframeShape(parcelVtTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
}
}
}
if (graphConfigProperty.isEffLayer() == true
&& !compareStnIsOn && !compareTmIsOn) {
// draw effective layer lines
// drawEffectiveLayerLines(target);
target.drawWireframeShape(effectiveLayerLineShape,
NsharpConstants.color_cyan_md, 2,
commonLineStyle, font10);
}
// cloud
if (graphConfigProperty.isCloud() == true
&& !compareStnIsOn && !compareTmIsOn) {
if (cloudFMShape != null)
target.drawShadedShape(cloudFMShape, 1f);
if (cloudFMLabelShape != null)
target.drawWireframeShape(cloudFMLabelShape,
NsharpConstants.color_chocolate,
commonLinewidth * 3, commonLineStyle, font9);
if (cloudCEShape != null)
target.drawShadedShape(cloudCEShape, 1f);
}
if (graphConfigProperty.isOmega() == true
&& !compareStnIsOn && !compareTmIsOn) {
if (NsharpLoadDialog.getAccess() != null
&& (NsharpLoadDialog.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.MODEL_SND || NsharpLoadDialog
.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.PFC_SND)) {
// plot omega
drawOmega();
}
}
} else {
// by default, draw everything
if (!compareStnIsOn && !compareTmIsOn) {
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_red, TEMP_TYPE,
this.soundingLys);
// dew point curve
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_green, DEWPOINT_TYPE,
this.soundingLys);
// plot wetbulb trace
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WETBULB]);
target.drawWireframeShape(wetBulbTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
// plot virtual temp trace
lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_VIRTUAL_TEMP]);
target.drawWireframeShape(vtempTraceCurveRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
if (graphConfigProperty.isDcape() == true && rscHandler.isGoodData() //#5929
&& dacpeTraceRscShape != null && !compareStnIsOn
&& !compareTmIsOn && !overlayIsOn) {
if (soundingLys.size() > 0) {
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_DCAPE]);
target.drawWireframeShape(dacpeTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
// virtual temperature parcel trace curve
if (!overlayIsOn) {
lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_TV]);
target.drawWireframeShape(parcelVtTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
if (dacpeTraceRscShape != null) {
lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_DCAPE]);
target.drawWireframeShape(dacpeTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
}
// draw effective layer lines
// drawEffectiveLayerLines(target);
target.drawWireframeShape(effectiveLayerLineShape,
NsharpConstants.color_cyan_md, 2,
commonLineStyle, font10);
if (NsharpLoadDialog.getAccess() != null
&& (NsharpLoadDialog.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.MODEL_SND || NsharpLoadDialog
.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.PFC_SND)) {
// plot omega
drawOmega();
}
}
}
if (plotInteractiveTemp == true) {
if (currentSkewTEditMode == NsharpConstants.SKEWT_EDIT_MODE_EDITPOINT)
plotNsharpInteractiveEditingTemp(target,
currentZoomLevel, world,
NsharpConstants.color_white);
else if (currentSkewTEditMode == NsharpConstants.SKEWT_EDIT_MODE_MOVELINE)
plotNsharpMovingTempLine(target, world,
NsharpConstants.color_white);
}
}
if (graphConfigProperty.isEffLayer() == true && rscHandler.isGoodData() //#5929
&& !compareStnIsOn && !compareTmIsOn) {
// draw effective layer lines
// drawEffectiveLayerLines(target);
target.drawWireframeShape(effectiveLayerLineShape,
NsharpConstants.color_cyan_md, 2,
commonLineStyle, font10);
}
// cloud
if (graphConfigProperty.isCloud() == true && rscHandler.isGoodData() //#5929
&& !compareStnIsOn && !compareTmIsOn) {
if (cloudFMShape != null)
target.drawShadedShape(cloudFMShape, 1f);
if (cloudFMLabelShape != null)
target.drawWireframeShape(cloudFMLabelShape,
NsharpConstants.color_chocolate,
commonLinewidth * 3, commonLineStyle, font9);
if (cloudCEShape != null)
target.drawShadedShape(cloudCEShape, 1f);
}
if (graphConfigProperty.isOmega() == true
&& !compareStnIsOn && !compareTmIsOn) {
if (NsharpLoadDialog.getAccess() != null
&& (NsharpLoadDialog.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.MODEL_SND || NsharpLoadDialog
.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.PFC_SND)) {
// plot omega
drawOmega();
}
}
} else {
// by default, draw everything
if (!compareStnIsOn && !compareTmIsOn) {
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_red, TEMP_TYPE,
this.soundingLys);
// dew point curve
if (editGraphOn)
plotPressureTempEditPoints(target, world,
NsharpConstants.color_green, DEWPOINT_TYPE,
this.soundingLys);
if(rscHandler.isGoodData()) { //#5929
// plot wetbulb trace
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WETBULB]);
target.drawWireframeShape(wetBulbTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
// plot virtual temp trace
lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_VIRTUAL_TEMP]);
target.drawWireframeShape(vtempTraceCurveRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
target.clearClippingPlane();
// virtual temperature parcel trace curve
if (!overlayIsOn) {
lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_TV]);
target.drawWireframeShape(parcelVtTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
if (dacpeTraceRscShape != null) {
lp = linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_DCAPE]);
target.drawWireframeShape(dacpeTraceRscShape,
lp.getLineColor(), lp.getLineWidth(),
lp.getLineStyle(), font10);
}
}
// draw effective layer lines
// drawEffectiveLayerLines(target);
target.drawWireframeShape(effectiveLayerLineShape,
NsharpConstants.color_cyan_md, 2,
commonLineStyle, font10);
}
if (NsharpLoadDialog.getAccess() != null
&& (NsharpLoadDialog.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.MODEL_SND || NsharpLoadDialog
.getAccess()
.getActiveLoadSoundingType() == NsharpLoadDialog.PFC_SND)) {
// plot omega
drawOmega();
}
}
}
if (plotInteractiveTemp == true) {
if (currentSkewTEditMode == NsharpConstants.SKEWT_EDIT_MODE_EDITPOINT)
plotNsharpInteractiveEditingTemp(target,
currentZoomLevel, world,
NsharpConstants.color_white);
else if (currentSkewTEditMode == NsharpConstants.SKEWT_EDIT_MODE_MOVELINE)
plotNsharpMovingTempLine(target, world,
NsharpConstants.color_white);
}
target.clearClippingPlane();
// Wind Barb
if ((graphConfigProperty != null && graphConfigProperty
.isWindBarb() == true) || graphConfigProperty == null) {
double xPos = skewTBackground.getWindBarbXPosition();
if (overlayIsOn == true && this.previousSoundingLys != null) {
drawNsharpWindBarb(
target,
currentZoomLevel,
world,
linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1])
.getLineColor(), this.soundingLys,
xPos, 100);
if (!previousSoundingLys.equals(soundingLys))
drawNsharpWindBarb(
target,
currentZoomLevel,
world,
linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2])
.getLineColor(),
this.previousSoundingLys,
xPos - NsharpResourceHandler.BARB_LENGTH,
100);
} else {
if (!compareStnIsOn && !compareTmIsOn
&& !compareSndIsOn) {
drawNsharpWindBarb(target, currentZoomLevel, world,
graphConfigProperty.getWindBarbColor(),
this.soundingLys, xPos, 100);
} else {
int currentTimeListIndex = rscHandler
.getCurrentTimeElementListIndex();
int currentStnListIndex = rscHandler
.getCurrentStnElementListIndex();
int currentSndListIndex = rscHandler
.getCurrentSndElementListIndex();
List<NsharpOperationElement> stnElemList = rscHandler
.getStnElementList();
List<NsharpOperationElement> timeElemList = rscHandler
.getTimeElementList();
List<NsharpOperationElement> sndElemList = rscHandler
.getSndElementList();
List<List<List<NsharpSoundingElementStateProperty>>> stnTimeSndTable = rscHandler
.getStnTimeSndTable();
if (compareTmIsOn && currentStnListIndex >= 0
&& currentSndListIndex >= 0) {
int colorIndex;
for (NsharpOperationElement elm : timeElemList) {
if (elm.getActionState() == NsharpConstants.ActState.ACTIVE
&& stnTimeSndTable
.get(currentStnListIndex)
.get(timeElemList
.indexOf(elm))
.get(currentSndListIndex) != null) {
List<NcSoundingLayer> soundingLayeys = stnTimeSndTable
.get(currentStnListIndex)
.get(timeElemList.indexOf(elm))
.get(currentSndListIndex)
.getSndLyLst();
colorIndex = stnTimeSndTable
.get(currentStnListIndex)
.get(timeElemList.indexOf(elm))
.get(currentSndListIndex)
.getCompColorIndex();
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[colorIndex]);
drawNsharpWindBarb(target,
currentZoomLevel, world,
lp.getLineColor(),
soundingLayeys, xPos, 100);
}
}
} else if (compareStnIsOn
&& currentTimeListIndex >= 0
&& currentSndListIndex >= 0) {
int colorIndex;
for (NsharpOperationElement elm : stnElemList) {
if (elm.getActionState() == NsharpConstants.ActState.ACTIVE
&& stnTimeSndTable
.get(stnElemList
.indexOf(elm))
.get(currentTimeListIndex)
.get(currentSndListIndex) != null) {
List<NcSoundingLayer> soundingLayeys = stnTimeSndTable
.get(stnElemList.indexOf(elm))
.get(currentTimeListIndex)
.get(currentSndListIndex)
.getSndLyLst();
colorIndex = stnTimeSndTable
.get(stnElemList.indexOf(elm))
.get(currentTimeListIndex)
.get(currentSndListIndex)
.getCompColorIndex();
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[colorIndex]);
drawNsharpWindBarb(target,
currentZoomLevel, world,
lp.getLineColor(),
soundingLayeys, xPos, 100);
}
}
} else if (compareSndIsOn
&& currentStnListIndex >= 0
&& currentTimeListIndex >= 0) {
int colorIndex;
// start FixMark:nearByStnCompSnd
List<NsharpResourceHandler.CompSndSelectedElem> sndCompElementList = rscHandler
.getCompSndSelectedElemList();
for (NsharpResourceHandler.CompSndSelectedElem compElem : sndCompElementList) {
NsharpSoundingElementStateProperty elemProp = stnTimeSndTable
.get(compElem.getStnIndex())
.get(compElem.getTimeIndex())
.get(compElem.getSndIndex());
if (sndElemList.get(compElem.getSndIndex())
.getActionState() == NsharpConstants.ActState.ACTIVE
&& elemProp != null) {
List<NcSoundingLayer> soundingLayeys = elemProp
.getSndLyLst();
colorIndex = elemProp
.getCompColorIndex();
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[colorIndex]);
drawNsharpWindBarb(target,
currentZoomLevel, world,
lp.getLineColor(),
soundingLayeys, xPos, 100);
}
}
/*
* original code for(NsharpOperationElement elm:
* sndElemList) { if(elm.getActionState() ==
* NsharpConstants.ActState.ACTIVE &&
* stnTimeSndTable.get(currentStnListIndex).get(
* currentTimeListIndex
* ).get(sndElemList.indexOf(elm))!=null){
* List<NcSoundingLayer> soundingLayeys =
* stnTimeSndTable.get(currentStnListIndex).get(
* currentTimeListIndex
* ).get(sndElemList.indexOf(
* elm)).getSndLyLst(); colorIndex =
* stnTimeSndTable.get(currentStnListIndex).get(
* currentTimeListIndex
* ).get(sndElemList.indexOf(
* elm)).getCompColorIndex(); NsharpLineProperty
* lp =
* linePropertyMap.get(NsharpConstants.lineNameArray
* [colorIndex]); drawNsharpWindBarb(target,
* currentZoomLevel, world, lp.getLineColor(),
* soundingLayeys, xPos,100); } }
*/
// end start FixMark:nearByStnCompSnd
}
}
}
// System.out.println("x1 pos"+xPos+ " x2 pos="+ (xPos -
// NsharpResourceHandler.BARB_LENGTH));
}
if( rscHandler.isGoodData() ){ //#5929)
drawHeightMark(target);
// draw EL, LFC, LCL, FZL, -20C, -30C lines
// drawLclLine(target);
target.drawWireframeShape(lclShape,
NsharpConstants.color_green, 2, LineStyle.SOLID, font10);
target.drawWireframeShape(elShape, NsharpConstants.color_red,
2, LineStyle.SOLID, font10);
target.drawWireframeShape(lfcShape,
NsharpConstants.color_yellow, 2, LineStyle.SOLID,
font10);
target.drawWireframeShape(fzlShape, NsharpConstants.color_cyan,
2, LineStyle.SOLID, font10);
}
drawNsharpFileNameAndSampling(target, currentZoomLevel);
// draw cursor data
if (cursorInSkewT == true && rscHandler.isGoodData()) {
if ((curseToggledFontLevel < CURSER_STRING_OFF)
&& (cursorTopWindBarb == false || windBarbMagnify == false))
drawNsharpSkewtCursorData(target);
}
// Wind Barb
if ((graphConfigProperty != null && graphConfigProperty
.isWindBarb() == true) || graphConfigProperty == null) {
double xPos = skewTBackground.getWindBarbXPosition();
if (overlayIsOn == true && this.previousSoundingLys != null) {
drawNsharpWindBarb(
target,
currentZoomLevel,
world,
linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1])
.getLineColor(), this.soundingLys,
xPos, 100);
if (!previousSoundingLys.equals(soundingLys))
drawNsharpWindBarb(
target,
currentZoomLevel,
world,
linePropertyMap
.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2])
.getLineColor(),
this.previousSoundingLys,
xPos - NsharpResourceHandler.BARB_LENGTH,
100);
} else {
if (!compareStnIsOn && !compareTmIsOn
&& !compareSndIsOn) {
drawNsharpWindBarb(target, currentZoomLevel, world,
graphConfigProperty.getWindBarbColor(),
this.soundingLys, xPos, 100);
} else {
int currentTimeListIndex = rscHandler
.getCurrentTimeElementListIndex();
int currentStnListIndex = rscHandler
.getCurrentStnElementListIndex();
int currentSndListIndex = rscHandler
.getCurrentSndElementListIndex();
List<NsharpOperationElement> stnElemList = rscHandler
.getStnElementList();
List<NsharpOperationElement> timeElemList = rscHandler
.getTimeElementList();
List<NsharpOperationElement> sndElemList = rscHandler
.getSndElementList();
List<List<List<NsharpSoundingElementStateProperty>>> stnTimeSndTable = rscHandler
.getStnTimeSndTable();
if (compareTmIsOn && currentStnListIndex >= 0
&& currentSndListIndex >= 0) {
int colorIndex;
for (NsharpOperationElement elm : timeElemList) {
if (elm.getActionState() == NsharpConstants.ActState.ACTIVE
&& stnTimeSndTable
.get(currentStnListIndex)
.get(timeElemList
.indexOf(elm))
.get(currentSndListIndex) != null) {
List<NcSoundingLayer> soundingLayeys = stnTimeSndTable
.get(currentStnListIndex)
.get(timeElemList.indexOf(elm))
.get(currentSndListIndex)
.getSndLyLst();
colorIndex = stnTimeSndTable
.get(currentStnListIndex)
.get(timeElemList.indexOf(elm))
.get(currentSndListIndex)
.getCompColorIndex();
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[colorIndex]);
drawNsharpWindBarb(target,
currentZoomLevel, world,
lp.getLineColor(),
soundingLayeys, xPos, 100);
}
}
} else if (compareStnIsOn
&& currentTimeListIndex >= 0
&& currentSndListIndex >= 0) {
int colorIndex;
for (NsharpOperationElement elm : stnElemList) {
if (elm.getActionState() == NsharpConstants.ActState.ACTIVE
&& stnTimeSndTable
.get(stnElemList
.indexOf(elm))
.get(currentTimeListIndex)
.get(currentSndListIndex) != null) {
List<NcSoundingLayer> soundingLayeys = stnTimeSndTable
.get(stnElemList.indexOf(elm))
.get(currentTimeListIndex)
.get(currentSndListIndex)
.getSndLyLst();
colorIndex = stnTimeSndTable
.get(stnElemList.indexOf(elm))
.get(currentTimeListIndex)
.get(currentSndListIndex)
.getCompColorIndex();
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[colorIndex]);
drawNsharpWindBarb(target,
currentZoomLevel, world,
lp.getLineColor(),
soundingLayeys, xPos, 100);
}
}
} else if (compareSndIsOn
&& currentStnListIndex >= 0
&& currentTimeListIndex >= 0) {
int colorIndex;
// start FixMark:nearByStnCompSnd
List<NsharpResourceHandler.CompSndSelectedElem> sndCompElementList = rscHandler
.getCompSndSelectedElemList();
for (NsharpResourceHandler.CompSndSelectedElem compElem : sndCompElementList) {
NsharpSoundingElementStateProperty elemProp = stnTimeSndTable
.get(compElem.getStnIndex())
.get(compElem.getTimeIndex())
.get(compElem.getSndIndex());
if (sndElemList.get(compElem.getSndIndex())
.getActionState() == NsharpConstants.ActState.ACTIVE
&& elemProp != null) {
List<NcSoundingLayer> soundingLayeys = elemProp
.getSndLyLst();
colorIndex = elemProp
.getCompColorIndex();
NsharpLineProperty lp = linePropertyMap
.get(NsharpConstants.lineNameArray[colorIndex]);
drawNsharpWindBarb(target,
currentZoomLevel, world,
lp.getLineColor(),
soundingLayeys, xPos, 100);
}
}
/*
* original code for(NsharpOperationElement elm:
* sndElemList) { if(elm.getActionState() ==
* NsharpConstants.ActState.ACTIVE &&
* stnTimeSndTable.get(currentStnListIndex).get(
* currentTimeListIndex
* ).get(sndElemList.indexOf(elm))!=null){
* List<NcSoundingLayer> soundingLayeys =
* stnTimeSndTable.get(currentStnListIndex).get(
* currentTimeListIndex
* ).get(sndElemList.indexOf(
* elm)).getSndLyLst(); colorIndex =
* stnTimeSndTable.get(currentStnListIndex).get(
* currentTimeListIndex
* ).get(sndElemList.indexOf(
* elm)).getCompColorIndex(); NsharpLineProperty
* lp =
* linePropertyMap.get(NsharpConstants.lineNameArray
* [colorIndex]); drawNsharpWindBarb(target,
* currentZoomLevel, world, lp.getLineColor(),
* soundingLayeys, xPos,100); } }
*/
// end start FixMark:nearByStnCompSnd
}
}
}
// System.out.println("x1 pos"+xPos+ " x2 pos="+ (xPos -
// NsharpResourceHandler.BARB_LENGTH));
}
drawHeightMark(target);
// draw EL, LFC, LCL, FZL, -20C, -30C lines
// drawLclLine(target);
target.drawWireframeShape(lclShape,
NsharpConstants.color_green, 2, LineStyle.SOLID, font10);
target.drawWireframeShape(elShape, NsharpConstants.color_red,
2, LineStyle.SOLID, font10);
target.drawWireframeShape(lfcShape,
NsharpConstants.color_yellow, 2, LineStyle.SOLID,
font10);
target.drawWireframeShape(fzlShape, NsharpConstants.color_cyan,
2, LineStyle.SOLID, font10);
drawNsharpFileNameAndSampling(target, currentZoomLevel);
// draw cursor data
if (cursorInSkewT == true) {
if ((curseToggledFontLevel < CURSER_STRING_OFF)
&& (cursorTopWindBarb == false || windBarbMagnify == false))
drawNsharpSkewtCursorData(target);
}
}// end of currentGraphMode= NsharpConstants.GRAPH_SKEWT
else if (currentGraphMode == NsharpConstants.GRAPH_ICING) {
else if (currentGraphMode == NsharpConstants.GRAPH_ICING && rscHandler.isGoodData()) {//#5929
paintIcing(currentZoomLevel, target);
} else if (currentGraphMode == NsharpConstants.GRAPH_TURB) {
} else if (currentGraphMode == NsharpConstants.GRAPH_TURB && rscHandler.isGoodData()) {//#5929
paintTurbulence(currentZoomLevel, target);
}
// drawNsharpFileNameAndSampling(target, currentZoomLevel);
@ -3505,31 +3518,37 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource {
*/
public void createRscWireFrameShapes() {
// System.out.println("createRscWireFrameShapes called");
if (target != null) {
disposeRscWireFrameShapes();
if (soundingLys != null) {
// createRscOmegaShape();
// createRscHeightMarkShape();
createRscwetBulbTraceShape();
createRscPressTempCurveShapeAll(target);
createRscVTempTraceShape();
createRscParcelRtTraceShapesList(rscHandler.getCurrentParcel(),
rscHandler.getCurrentParcelLayerPressure());// real temp
// trace
createRscParcelTraceShapes(rscHandler.getCurrentParcel(),
rscHandler.getCurrentParcelLayerPressure()); // Virtual
// Temp
// Trace
// and
// DCAPE
// trace
createLCLEtcLinesShape();
createEffectiveLayerLinesShape();
createCloudsShape();
updatePsblWatchColor();
}
}
// System.out.println("createRscWireFrameShapes called");
if (target != null) {
disposeRscWireFrameShapes();
if (soundingLys != null){
if( rscHandler.isGoodData()) {//#5929
// createRscOmegaShape();
// createRscHeightMarkShape();
createRscwetBulbTraceShape();
createRscPressTempCurveShapeAll(target);
createRscVTempTraceShape();
createRscParcelRtTraceShapesList(rscHandler.getCurrentParcel(),
rscHandler.getCurrentParcelLayerPressure());// real temp
// trace
createRscParcelTraceShapes(rscHandler.getCurrentParcel(),
rscHandler.getCurrentParcelLayerPressure()); // Virtual
// Temp
// Trace
// and
// DCAPE
// trace
createLCLEtcLinesShape();
createEffectiveLayerLinesShape();
createCloudsShape();
updatePsblWatchColor();
}
else {//#5929
createRscPressTempCurveShapeAll(target);
}
}
}
}
public void disposeRscWireFrameShapes() {

View file

@ -15,7 +15,11 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc;
* 05/23/2014 Chin Chen update SHIP, STP Stats based on bigsharp version 2013Jun12
* 08/18/2014 Chin Chen implemented SARS, FIRE, HAIL, WINTER SPC graphs based on
* bigsharp version 2013Jun12
*
* 12/03/2014 DR#16884 Chin Chen fixed issue, NSHARP crashes if user loops a product and
* then clicks WINTER/FIRE buttons in Toolbar
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
* </pre>
*
* @author Chin Chen
@ -109,21 +113,11 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
private float nonSupercell[] = { 8.2f, 12.2f, 14.4f, 15.8f, 17.0f, 20.0f,
23.2f, 27.0f, 30.4f, 32.0f };
private String hailSize[][] = {
{ "", "<1", "1-1.5", "1.75", "2", "2.5", "2.75", "3-4", ">4" },
{ "+1 STD", "1.9", "2.0", "2.3", "2.8", "2.9", "3.0", "3.0", "3.0" },
{ "AVG", "1.5", "1.5", "1.8", "2.3", "2.5", "2.5", "2.6", "2.7" },
{ "-1 STD", "1.1", "1.1", "1.3", "1.7", "2.1", "2.1", "2.2", "2.4" } };
private RGB white = NsharpConstants.color_white;
private RGB cyan = NsharpConstants.color_cyan_md;
private RGB hailSizeColor[][] = {
{ white, white, white, white, white, white, white, white, white },
{ white, cyan, cyan, cyan, cyan, cyan, cyan, cyan, cyan },
{ white, cyan, cyan, cyan, cyan, cyan, cyan, cyan, cyan },
{ white, cyan, cyan, cyan, cyan, cyan, cyan, cyan, cyan } };
private NsharpNative.NsharpLibrary.HailInfoStr hailInfo = new NsharpNative.NsharpLibrary.HailInfoStr();
@ -133,6 +127,18 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
private NsharpNative.NsharpLibrary.WinterInfoStr winterInfo = new NsharpNative.NsharpLibrary.WinterInfoStr();
private String hailSize[][] = {
{ "", "<1", "1-1.5", "1.75", "2", "2.5", "2.75", "3-4", ">4" },
{ "+1 STD", "1.9", "2.0", "2.3", "2.8", "2.9", "3.0", "3.0", "3.0" },
{ "AVG", "1.5", "1.5", "1.8", "2.3", "2.5", "2.5", "2.6", "2.7" },
{ "-1 STD", "1.1", "1.1", "1.3", "1.7", "2.1", "2.1", "2.2", "2.4" } };
private RGB hailSizeColor[][] = {
{ white, white, white, white, white, white, white, white, white },
{ white, cyan, cyan, cyan, cyan, cyan, cyan, cyan, cyan },
{ white, cyan, cyan, cyan, cyan, cyan, cyan, cyan, cyan },
{ white, cyan, cyan, cyan, cyan, cyan, cyan, cyan, cyan } };
public NsharpSpcGraphsPaneResource(AbstractResourceData resourceData,
LoadProperties loadProperties, NsharpAbstractPaneDescriptor desc) {
super(resourceData, loadProperties, desc);
@ -140,21 +146,6 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
rightGraph = NsharpPaletteWindow.getRightGraph();
}
private void underDevelopment(int side) throws VizException {
double xpos;
if (side == left)
xpos = spcLeftXOrig + spcFrameWidth / 2;
else
xpos = spcRightXOrig + spcFrameWidth / 2;
DrawableString str = new DrawableString("under development",
NsharpConstants.color_green);
str.font = font12;
str.horizontalAlignment = HorizontalAlignment.LEFT;
str.verticallAlignment = VerticalAlignment.TOP;
ypos = spcYOrig + spcHeight / 2;
str.setCoordinates(xpos, ypos);
target.drawStrings(str);
}
private void setXyStartingPosition(int side) {
ystart = spcYOrig;
@ -298,35 +289,6 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
// System.out.println("java hail str #"+ (i+1)+ " "+ hailStr);
}
/*
* ypos = spcYEnd - 4 * charHeight; for(int i=0; i < 2; i++){ String
* supStr = new String(sarsInfo.getTorStr(), (i*60), 60);
* //System.out.println("tor str #"+ (1+ i)+ " "+ supStr); RGB strColor
* = NsharpConstants.gempakColorToRGB.get(sarsInfo.getTorStrColor());
* supStr = supStr.substring(0, supStr.indexOf('\0'));// get rid of
* tailing null char(s), as DrawableString will print them out
* DrawableString supercellMatchStr = new DrawableString(supStr,
* strColor); supercellMatchStr.font = font10;
* supercellMatchStr.horizontalAlignment = HorizontalAlignment.LEFT;
* supercellMatchStr.verticallAlignment = VerticalAlignment.TOP; xpos =
* xstart ; ypos = ypos + charHeight;
* supercellMatchStr.setCoordinates(xpos, ypos);
* strList.add(supercellMatchStr);
*
* String sighailStr = new String(sarsInfo.getSighailStr(), (i*60), 60);
* //System.out.println("sighail str #"+ (1+ i)+ " "+ sighailStr); RGB
* strColor1 =
* NsharpConstants.gempakColorToRGB.get(sarsInfo.getSighailStrColor());
* sighailStr = sighailStr.substring(0, sighailStr.indexOf('\0'));// get
* rid of tailing null char(s), as DrawableString will print them out
* DrawableString sighailMatchStr = new DrawableString(sighailStr,
* strColor1); sighailMatchStr.font = font10;
* sighailMatchStr.horizontalAlignment = HorizontalAlignment.LEFT;
* sighailMatchStr.verticallAlignment = VerticalAlignment.TOP; xpos =
* xstart + 0.51 *spcFrameWidth; sighailMatchStr.setCoordinates(xpos,
* ypos); strList.add(sighailMatchStr); }
*/
target.drawStrings(strList.toArray(new DrawableString[strList.size()]));
target.drawLine(lineList.toArray(new DrawableLine[lineList.size()]));
}
@ -1621,13 +1583,15 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
// logic statements for Thompson et al. (2012) WAF sample
// 39 sigtor, 28 non-sigtor supercells
if (cin >= 10) {
// setcolor(7)
psigt_stpcin = "0.58";
stpcColor = NsharpConstants.color_magenta;// setcolor(7);
stpcColor = NsharpConstants.color_magenta;;
}
// 39 sigtor, 32 non-sigtor supercells
else if (cin >= 8) {
// setcolor(7)
psigt_stpcin = "0.55";
stpcColor = NsharpConstants.color_magenta;// setcolor(7);
stpcColor = NsharpConstants.color_magenta;
}
// 54 sigtor, 104 non-sigtor supercells
else if (cin >= 6) {
@ -1745,17 +1709,6 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
valueStp.verticallAlignment = VerticalAlignment.TOP;
valueStp.setCoordinates(tboxValueStart, ypos);
strList.add(valueStp);
// reset parcel to previous "oldlplchoice" , TBD
/*
* float pres; if(oldlplchoice ==
* NsharpNativeConstants.PARCELTYPE_USER_DEFINED){
* if(NsharpParcelDialog.getAccess() != null){ pres =
* NsharpParcelDialog.getAccess().getUserDefdParcelMb(); } else pres =
* NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); } else pres
* = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice);
* nsharpNative.nsharpLib.define_parcel(oldlplchoice,pres);
*/
target.drawStrings(strList.toArray(new DrawableString[strList.size()]));
target.drawLine(lineList.toArray(new DrawableLine[lineList.size()]));
@ -1876,7 +1829,7 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
short oldlplchoice;
_parcel pcl = new _parcel();
;
_lplvalues lpvls = new _lplvalues();
nsharpNative.nsharpLib.get_lpvaluesData(lpvls);
// oldlplchoice = lpvls.flag;
@ -1931,12 +1884,6 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
lineList.add(ebsline);
}
float pres;
/*
* if(oldlplchoice == NsharpNativeConstants.PARCELTYPE_USER_DEFINED){
* if(NsharpParcelDialog.getAccess() != null){ pres =
* NsharpParcelDialog.getAccess().getUserDefdParcelMb(); } else pres =
* NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); } else
*/
oldlplchoice = rscHandler.getCurrentParcel();
pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice);
nsharpNative.nsharpLib.define_parcel(oldlplchoice, pres);
@ -1951,27 +1898,24 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
PaintProperties paintProps) throws VizException {
super.paintInternal(target, paintProps);
// defineCharHeight(font10);
if (rscHandler == null || rscHandler.getSoundingLys() == null)
if (rscHandler == null || rscHandler.getSoundingLys() == null || !rscHandler.isGoodData())//#5929
return;
this.font10.setSmoothing(false);
this.font10.setScaleFont(false);
hRatio = paintProps.getView().getExtent().getWidth()
/ paintProps.getCanvasBounds().width;
DrawableLine line = new DrawableLine();
line.setCoordinates(spcRightXOrig, spcYOrig);
line.addPoint(spcRightXOrig, spcYOrig + spcHeight);
line.lineStyle = LineStyle.SOLID;
line.basics.color = NsharpConstants.color_white;
line.width = 1;
line.setCoordinates(spcRightXOrig, spcYOrig);
line.addPoint(spcRightXOrig, spcYOrig + spcHeight);
target.drawLine(line);
PixelExtent spcExt = new PixelExtent(new Rectangle((int) spcLeftXOrig,
(int) spcYOrig, (int) spcWidth, (int) spcHeight));
target.drawRect(spcExt, NsharpConstants.color_white, 1f, 1f); // box
// border
// line
PixelExtent extent = new PixelExtent(new Rectangle((int) spcLeftXOrig,
(int) spcYOrig, (int) spcFrameWidth, (int) spcHeight));
// target.setupClippingPlane(extent);
switch (leftGraph) {
case EBS:
plotEBS(left);
@ -1995,10 +1939,6 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
plotSars(left);
break;
}
// target.clearClippingPlane();
extent = new PixelExtent(new Rectangle((int) spcRightXOrig,
(int) spcYOrig, (int) spcFrameWidth, (int) spcHeight));
// target.setupClippingPlane(extent);
switch (rightGraph) {
case EBS:
plotEBS(right);
@ -2022,7 +1962,7 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
plotSars(right);
break;
}
// target.clearClippingPlane();
}
@Override
@ -2030,19 +1970,46 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
super.initInternal(target);
}
/*
* private void disposeEbsShape(){ if(ebsBkgLblShape != null)
* ebsBkgLblShape.dispose(); if(ebsBkgLineShape != null)
* ebsBkgLineShape.dispose(); if(ebsSupercellShape != null)
* ebsSupercellShape.dispose(); if(ebsMrglSupShape != null)
* ebsMrglSupShape.dispose(); if(ebsNonSupSgape != null)
* ebsNonSupSgape.dispose(); }
*/
@Override
protected void disposeInternal() {
super.disposeInternal();
}
public NsharpConstants.SPCGraph getLeftGraph() {
return leftGraph;
}
public void setGraphs(NsharpConstants.SPCGraph leftGraph,
NsharpConstants.SPCGraph rightGraph) {
this.leftGraph = leftGraph;
this.rightGraph = rightGraph;
getSpcGraphsInfo();
rscHandler.refreshPane();
}
public NsharpConstants.SPCGraph getRightGraph() {
return rightGraph;
}
public synchronized void getSpcGraphsInfo() {
if (rightGraph == NsharpConstants.SPCGraph.SARS
|| leftGraph == NsharpConstants.SPCGraph.SARS) {
nsharpNative.nsharpLib.getSarsInfo(sarsInfo);
}
if (leftGraph == NsharpConstants.SPCGraph.WINTER
|| rightGraph == NsharpConstants.SPCGraph.WINTER) {
nsharpNative.nsharpLib.getWinterInfo(winterInfo);
}
if (rightGraph == NsharpConstants.SPCGraph.FIRE
|| leftGraph == NsharpConstants.SPCGraph.FIRE) {
nsharpNative.nsharpLib.getFireInfo(fireInfo);
}
if (leftGraph == NsharpConstants.SPCGraph.HAIL
|| rightGraph == NsharpConstants.SPCGraph.HAIL) {
nsharpNative.nsharpLib.getHailInfo(hailInfo);
}
}
@Override
public void handleResize() {
@ -2064,38 +2031,4 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource {
spcYEnd = ext.getMaxY();
}
public NsharpConstants.SPCGraph getLeftGraph() {
return leftGraph;
}
public void setGraphs(NsharpConstants.SPCGraph leftGraph,
NsharpConstants.SPCGraph rightGraph) {
this.leftGraph = leftGraph;
this.rightGraph = rightGraph;
getSpcGraphsInfo();
rscHandler.refreshPane();
}
public NsharpConstants.SPCGraph getRightGraph() {
return rightGraph;
}
public void getSpcGraphsInfo() {
if (leftGraph == NsharpConstants.SPCGraph.WINTER
|| rightGraph == NsharpConstants.SPCGraph.WINTER) {
nsharpNative.nsharpLib.getWinterInfo(winterInfo);
}
if (leftGraph == NsharpConstants.SPCGraph.FIRE
|| rightGraph == NsharpConstants.SPCGraph.FIRE) {
nsharpNative.nsharpLib.getFireInfo(fireInfo);
}
if (leftGraph == NsharpConstants.SPCGraph.HAIL
|| rightGraph == NsharpConstants.SPCGraph.HAIL) {
nsharpNative.nsharpLib.getHailInfo(hailInfo);
}
if (leftGraph == NsharpConstants.SPCGraph.SARS
|| rightGraph == NsharpConstants.SPCGraph.SARS) {
nsharpNative.nsharpLib.getSarsInfo(sarsInfo);
}
}
}

View file

@ -10,6 +10,9 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc;
* Date Ticket# Engineer Description
* ------- ------- -------- -----------
* 04/23/2012 229 Chin Chen Initial coding
* 01/27/2015 DR#17006,
* Task#5929 Chin Chen NSHARP freezes when loading a sounding from MDCRS products
* in Volume Browser
*
* </pre>
*
@ -159,11 +162,14 @@ public class NsharpWitoPaneResource extends NsharpAbstractPaneResource{
float x1 = verticalWindXOrig+ (verticalWindWidth/2);
target.drawLine(x1, verticalWindYOrig, 0, x1, verticalWindYOrig+verticalWindHeight, 0,
NsharpConstants.color_white, 1, LineStyle.DASHED);
target.drawWireframeShape(verticalWindLabelShape, NsharpConstants.color_white,
if(verticalWindLabelShape!=null) //#5929
target.drawWireframeShape(verticalWindLabelShape, NsharpConstants.color_white,
0.3F, commonLineStyle,font10);
target.drawWireframeShape(verticalWindRShape, NsharpConstants.color_red,
if(verticalWindRShape!=null)
target.drawWireframeShape(verticalWindRShape, NsharpConstants.color_red,
0.3F, commonLineStyle,font10);
target.drawWireframeShape(verticalWindSbShape, NsharpConstants.color_skyblue,
if(verticalWindSbShape!=null)
target.drawWireframeShape(verticalWindSbShape, NsharpConstants.color_skyblue,
0.3F, commonLineStyle,font10);
target.clearClippingPlane();
}
@ -304,7 +310,7 @@ public class NsharpWitoPaneResource extends NsharpAbstractPaneResource{
windBoxWindRscShapeList.add(shNcolor);
float surfaceLevel = soundingLys.get(0).getGeoHeight(); //#5929
//System.out.println("my wolrd minvY="+ myYViewMin+ " maxVY="+myYViewMax+ " YRange="+myYViewRange);
for (NcSoundingLayer layer : soundingLys) {
float pressure = layer.getPressure();
@ -321,13 +327,14 @@ public class NsharpWitoPaneResource extends NsharpAbstractPaneResource{
//System.out.println("Wind p="+pressure+" yP="+ windBoxY+ " ratio="+yRatio);
float geoHt = layer.getGeoHeight();
double [][] lines = {{windBoxX, windBoxY},{windBoxX + (spd) * xRatio,windBoxY}};
if(geoHt <nsharpNative.nsharpLib.msl(3000))
//use MSL here, so Converts height from (meters) AGL to MSL. #5929
if(geoHt < (3000+surfaceLevel))
shapeR.addLineSegment(lines);
else if(geoHt < nsharpNative.nsharpLib.msl(6000))
else if(geoHt < (6000+surfaceLevel))
shapeG.addLineSegment(lines);
else if(geoHt < nsharpNative.nsharpLib.msl(9000))
else if(geoHt < (9000+surfaceLevel))
shapeY.addLineSegment(lines);
else if(geoHt < nsharpNative.nsharpLib.msl(12000))
else if(geoHt < (12000+surfaceLevel))
shapeC.addLineSegment(lines);
else
shapeV.addLineSegment(lines);
@ -437,7 +444,6 @@ public class NsharpWitoPaneResource extends NsharpAbstractPaneResource{
verticalWindLabelShape.compile();
}
/**
* Create all wire frame shapes at one place.
* Should be used only when a new resource is becoming Current active resource to be displayed.
@ -447,23 +453,24 @@ public class NsharpWitoPaneResource extends NsharpAbstractPaneResource{
if(target== null || rscHandler== null || inSidePane )
return;
//System.out.println("whitoPane="+this.toString()+" createAllWireFrameShapes called");
rscHandler.repopulateSndgData();
disposeAllWireFrameShapes();
if(soundingLys != null){
NsharpGenericPaneBackground skewtBgd = rscHandler.getSkewtPaneRsc().getActiveBackground();
if(skewtBgd!=null){
vpc = skewtBgd.getViewablePressureContainer(soundingLys);
vplc = skewtBgd.getViewablePressureLinesContainer();
}
createRscOmegaShape();
createRscWindBoxWindShape();
createRscVerticalWindShape();
//rscHandler.repopulateSndgData();//#5929 TBD why need this?????
disposeAllWireFrameShapes();
if(soundingLys != null){
NsharpGenericPaneBackground skewtBgd = rscHandler.getSkewtPaneRsc().getActiveBackground();
if(skewtBgd!=null){
vpc = skewtBgd.getViewablePressureContainer(soundingLys);
vplc = skewtBgd.getViewablePressureLinesContainer();
}
//create static shape
createBkgOmegaShape();
createBkgWindBoxShape();
createRscOmegaShape();
createRscWindBoxWindShape();
if(rscHandler.isGoodData())//#5929
createRscVerticalWindShape();
}
//create static shape
createBkgOmegaShape();
createBkgWindBoxShape();
}
public void createRscWireFrameShapes(){
//System.out.println("createRscWireFrameShapes called");
@ -477,7 +484,8 @@ public class NsharpWitoPaneResource extends NsharpAbstractPaneResource{
}
createRscOmegaShape();
createRscWindBoxWindShape();
createRscVerticalWindShape();
if(rscHandler.isGoodData())//#5929
createRscVerticalWindShape();
}
}
}

View file

@ -790,12 +790,12 @@ public class NsharpNative {
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[] { "oprh", "layerDepth",
"meanLayerRh", "meanLayerMixRat", "meanLayerPw",
"meanLayerOmega", "initPhase", "tempProfile1",
"tempProfile2", "tempProfile3", "wetbulbProfile1",
"wetbulbProfile2", "wetbulbProfile3", "bestGuess1",
"bestGuess2" });
return Arrays.asList(new String[] { "mopw", "oprh",
"layerDepth", "meanLayerRh", "meanLayerMixRat",
"meanLayerPw", "meanLayerOmega", "initPhase",
"tempProfile1", "tempProfile2", "tempProfile3",
"wetbulbProfile1", "wetbulbProfile2",
"wetbulbProfile3", "bestGuess1", "bestGuess2" });
}
}

View file

@ -1603,6 +1603,7 @@ public class NsharpPaletteWindow extends ViewPart implements SelectionListener,
} else {
hailBtn.setEnabled(false);
}
hailBtn.setEnabled(false); //Chin ::: temporarily disable HAIL button
hailBtn.addListener(SWT.MouseUp, new Listener() {
public void handleEvent(Event event) {
if (leftGraph != NsharpConstants.SPCGraph.HAIL

View file

@ -177,7 +177,7 @@ rm -f %{_build_root}/awips2/java/bin/jmc
# The licenses
mkdir -p %{_build_root}/awips2/java/licenses
LEGAL_DIR="%{_baseline_workspace}/rpms/legal"
cp -v ${LEGAL_DIR}/*.txt ${LEGAL_DIR}/*.pdf \
cp -v ${LEGAL_DIR}/*.pdf \
%{_build_root}/awips2/java/licenses
if [ $? -ne 0 ]; then
exit 1

View file

@ -21,9 +21,9 @@ Packager: Bryan Kowal
AutoReq: no
BuildRequires: awips2-postgresql = 9.2.3-1.el6
BuildRequires: postgresql = 8.4.13-1.el6_3
BuildRequires: postgresql-devel = 8.4.13-1.el6_3
BuildRequires: postgresql-libs = 8.4.13-1.el6_3
BuildRequires: postgresql >= 8.4.13-1.el6_3
BuildRequires: postgresql-devel >= 8.4.13-1.el6_3
BuildRequires: postgresql-libs >= 8.4.13-1.el6_3
BuildRequires: wxGTK >= 2.8.12-1
BuildRequires: wxGTK-devel >= 2.8.12-1

Some files were not shown because too many files have changed in this diff Show more