awips2/cave/com.raytheon.viz.gfe/localization/gfe/itool/SetupTextEA.py
2022-05-05 12:34:50 -05:00

330 lines
13 KiB
Python

##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
import getopt, sys, os, LogStream, numpy, time, JUtil
from com.raytheon.uf.common.dataplugin.gfe.grid import Grid2DBit
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData, ReferenceID
# -- module -----------------------------------------------------------------
# The setupTextEA program. Sets up the text edit areas
# -- implementation ---------------------------------------------------------
# The ifpServerText program requires the following command line:
# setupTextEA -h hostname -p rpcPortNumber [-u user]
#
# -h host where the ifpServer is running
# -p rpc port number for the ifpServer.
# -u userid, defaults to GFETEST
# ---------------------------------------------------------------------------
##
# This is a base file that is not intended to be overridden.
##
class setupTextEA:
def __init__(self):
from com.raytheon.viz.gfe.core import DataManager
from java.lang import System
System.setProperty('user.name', 'GFETEST')
self.__host = None
self.__port = None
self.__user = 'GFETEST'
self.__dataMgr = DataManager.getInstance(None)
def process(self):
import TimeRange
# get list of edit areas that are part of the Zones/FireWx group
from com.raytheon.viz.gfe.smarttool import TextFileUtil, GridCycler
textID = TextFileUtil.getTextFile('Zones', 'editAreaGroups')
zoneList = []
textFile = open(textID.getFile().getPath())
textFile.readline()
for line in textFile:
zoneList.append(line.rstrip())
textFile.close()
textID = TextFileUtil.getTextFile('FireWxZones', 'editAreaGroups')
textFile = open(textID.getFile().getPath())
textFile.readline()
for line in textFile:
zoneList.append(line.rstrip())
textFile.close()
refMgr = self.__dataMgr.getRefManager()
# make the basic edit areas that are required, go sequentially through
# the zoneList
requiredEA = ["west_half","east_half","east_one_third",
"west_one_third", "east_two_thirds","west_two_thirds",
"east_one_quarter", "west_one_quarter", "east_three_quarters",
"west_three_quarters","Superior"]
for x in range(len(requiredEA)):
refData = refMgr.loadRefSet(ReferenceID(zoneList[x]))
ea = ReferenceData(refData)
ea.setId(ReferenceID(requiredEA[x]))
refMgr.saveRefSet(ea)
#ea = self.__client.getEditAreaPolygons(zoneList[x])
#self.__client.saveEditArea(requiredEA[x], ea)
LogStream.logEvent("Saved ", zoneList[x], "under", requiredEA[x])
# special EAs (source,destination)
special = [("ISC_Send_Area","FireArea"), ("ISC_Send_Area", "area3")]
for s in special:
refData = refMgr.loadRefSet(ReferenceID(s[0]))
ea = ReferenceData(refData)
ea.setId(ReferenceID(s[1]))
refMgr.saveRefSet(ea)
#ea = self.__client.getEditAreaPolygons(s[0])
#self.__client.saveEditArea(s[1], ea)
LogStream.logEvent("Saved ", s[0], "under", s[1])
# topography simulated based edit areas
# area3 = whole area, AboveElev, BelowElev
LogStream.logEvent("Calculating topo-dependent edit areas...")
topo = self.__dataMgr.getParmManager().getParmInExpr("Topo", True)
topogrid = GridCycler.getInstance().getCorrespondingResult(
topo, TimeRange.allTimes().toJavaObj(), "TimeWtAverage")
topogrid = topogrid[0].getGridSlice().getNDArray()
iscSend = ReferenceID('ISC_Send_Area')
#wholeGrid = self.__client.getEditArea("ISC_Send_Area")
wholeGrid = refMgr.loadRefSet(iscSend).getGrid().getNDArray()
topoAve = 0
count = 0
minx, maxx, miny, maxy = self.__extremaOfSetBits(wholeGrid)
for x in range(minx, maxx):
for y in range(miny, maxy):
if wholeGrid[y,x] == 1:
count = count + 1
topoAve = topoAve + topogrid[y,x]
topoAve = topoAve / count
aboveGrid = wholeGrid * 0
belowGrid = wholeGrid * 0
for x in range(topogrid.shape[1]):
for y in range(topogrid.shape[0]):
if wholeGrid[y,x] == 1:
if topogrid[y,x] > topoAve:
aboveGrid[y,x] = 1
else:
belowGrid[y,x] = 1
# area1 and area2 need to be "BelowElev", but should be different
# than area3
desiredCount = 2000
count = 0
area1 = wholeGrid * 0
area2 = wholeGrid * 0
for x in range(topogrid.shape[1]):
if count < desiredCount:
for y in range(topogrid.shape[0]):
if wholeGrid[y,x] == 0 and topogrid[y,x] < topoAve:
area1[y,x] = 1
belowGrid[y,x] = 1
count = count + 1
count = 0
for x in range(topogrid.shape[1]):
if count < desiredCount:
for y in range(topogrid.shape[0]):
if wholeGrid[y,x] == 0 and topogrid[y,x] < topoAve and \
area1[y,x] == 0:
area2[y,x] = 1
belowGrid[y,x] = 1
count = count + 1
# save all topography-dependent edit areas
self.__saveEA("area1", area1)
LogStream.logEvent("Saved area1 based on area2, area3, and topo <",
topoAve)
self.__saveEA("area2", area2)
LogStream.logEvent("Saved area2 based on area1, area3, and topo <",
topoAve)
self.__saveEA("AboveElev", aboveGrid)
LogStream.logEvent("Saved AboveElev based on area3 > ", topoAve)
self.__saveEA("BelowElev", belowGrid)
LogStream.logEvent("Saved BelowElev based on area3 <= ", topoAve)
self.__saveEA("Ridges", aboveGrid)
LogStream.logEvent("Saved Ridges based on area3 > ", topoAve)
self.__saveEA("Valleys", belowGrid)
LogStream.logEvent("Saved Valleys based on area3 < ", topoAve)
self.__saveEA("Inland", aboveGrid)
LogStream.logEvent("Saved Ridges based on area3 > ", topoAve)
self.__saveEA("Coastal", belowGrid)
LogStream.logEvent("Saved Valleys based on area3 < ", topoAve)
#city areas, which are a small part of other edit areas
cityBased = [("area1",["city1","city2"]), ("area2", ["city3"]),
("area3",["city4", "area3_pt"])]
for baseArea,cityAreas in cityBased:
#wholeGrid = self.__client.getEditArea(baseArea)
wholeGrid = refMgr.loadRefSet(ReferenceID(baseArea)).getGrid().getNDArray()
minx, maxx, miny, maxy = self.__extremaOfSetBits(wholeGrid)
cNumber = 0
print(minx, maxx, miny, maxy, wholeGrid.shape)
for x in range(minx, maxx):
for y in range(miny, maxy):
if wholeGrid[y,x] == 1:
if cNumber >= len(cityAreas):
break
cityGrid = numpy.logical_and(wholeGrid, 0)
cityGrid[y,x] = 1
self.__saveEA(cityAreas[cNumber], cityGrid.astype('int8'))
LogStream.logEvent("Saved ", cityAreas[cNumber],
"based on:", baseArea)
cNumber = cNumber + 1
# special for ISC areas for CCF database source test
#txt = self.__eagdb["ISC"]
#iscList = cPickle.loads(txt)
textID = TextFileUtil.getTextFile('ISC', 'editAreaGroups')
iscList = []
textFile = open(textID.getFile().getPath())
textFile.readline()
for line in textFile:
iscList.append(line.rstrip())
textFile.close()
count = 0
while count < 6:
for i in iscList:
if i == "ISC_Send_Area" or i == "ISC_Tool_Area":
continue
wholeGrid = refMgr.loadRefSet(ReferenceID(i)).getGrid().getNDArray()
minx, maxx, miny, maxy = self.__extremaOfSetBits(wholeGrid)
if minx == -1:
continue
ok = 1
print(minx, maxx, miny, maxy, wholeGrid.shape)
for x in range(minx, maxx):
if ok:
for y in range(miny, maxy):
if wholeGrid[y,x] == 1:
ptGrid = numpy.logical_and(wholeGrid, 0)
ptGrid[y,x] = 1
name = "isc" + repr(count)
self.__saveEA(name, ptGrid.astype('int8'))
requiredEA.append(name)
LogStream.logEvent("Saved ", name,
"based on ", i)
ok = 0
break
else:
break
count = count + 1
if count > 6:
break
# store an edit area group with all of the generated edit areas
requiredEA.append("FireArea")
requiredEA.append("AboveElev")
requiredEA.append("BelowElev")
requiredEA.append("Valleys")
requiredEA.append("Ridges")
requiredEA.append("Inland")
requiredEA.append("Coastal")
requiredEA.append("city1")
requiredEA.append("city2")
requiredEA.append("city3")
requiredEA.append("city4")
requiredEA.append("area3")
requiredEA.append("area2")
requiredEA.append("area1")
refMgr.saveGroup("GFETest", JUtil.pylistToJavaStringList(requiredEA))
time.sleep(.5)
def __saveEA(self, name, grid):
#save edit area from a grid
gloc = self.__dataMgr.getParmManager().compositeGridLocation()
id = ReferenceID(name)
# convert grid to polygons
grid2d = Grid2DBit.createBitGrid(int(gloc.getNx()), int(gloc.getNy()), grid)
refdata = ReferenceData(gloc, id, grid2d)
# save the edit area
self.__dataMgr.getRefManager().saveRefSet(refdata)
#self.__client.saveEditArea(name, ea)
def __extremaOfSetBits(self,mask):
"Returns tuple of extrema of set bits (minx,maxx, miny,maxy)"
xs = sum(mask)
ys = sum(mask, 1)
minx = maxx = miny = maxy = -1
for x in range(xs.shape[0]):
if xs[x] != 0:
if minx == -1:
minx = x
maxx = x
for y in range(ys.shape[0]):
if ys[y] != 0:
if miny == -1:
miny = y
maxy = y
return (minx, maxx, miny, maxy)
def __cmdLine(self):
optlist, oargs = getopt.getopt(sys.argv[1:], "h:p:u:")
for opt in optlist:
if opt[0] == '-h':
self.__host = opt[1]
elif opt[0] == '-p':
self.__port = int(opt[1])
elif opt[0] == '-u':
self.__user = opt[1]
# sanity checks, make sure all required switches are specified
if self.__host is None or self.__port is None:
self.__usage()
raise SyntaxWarning("Error: Missing host or port")
def __usage(self):
print("""
Usage: setupTextEA -h hostname -p rpcPortNumber [-u user]
-h host where the ifpServer is running
-p rpc port number for the ifpServer.
-u userid, defaults to GFETEST
""")
def main():
LogStream.logEvent("setupTextEA Starting")
try:
obj = setupTextEA()
obj.process()
except Exception as e:
LogStream.logProblem(LogStream.exc())
sys.exit(1)
LogStream.logEvent("setupTextEA Finished")
if __name__ == "__main__":
main()