Merge tag 'OB_14.4.1-18m' into omaha_14.4.1
14.4.1_18m Conflicts: edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java Former-commit-id: 390c7ec5c261717f6e0b2053761e12e1fcb68215
This commit is contained in:
commit
9b749e134d
61 changed files with 3655 additions and 1843 deletions
|
@ -124,7 +124,7 @@ public class RadarServer implements RadarEventListener {
|
|||
addListener(new DedicatedRadarActivator(this));
|
||||
addListener(new RequestScheduler(this));
|
||||
addListener(new RadarServerAvailable(this));
|
||||
addListener(new RadarWatchdogListener(configuration));
|
||||
addListener(new RadarWatchdogListener(this));
|
||||
}
|
||||
|
||||
public void addListener(RadarEventListener l) {
|
||||
|
|
|
@ -29,7 +29,8 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import com.raytheon.rcm.config.Configuration;
|
||||
import com.raytheon.rcm.config.RadarConfig;
|
||||
import com.raytheon.rcm.server.StatusManager.RadarStatus;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -43,6 +44,8 @@ import com.raytheon.rcm.config.Configuration;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------- ---------- ----------- --------------------------
|
||||
* May 12, 2014 DR 16319 dhuffman Initial creation.
|
||||
* Feb 10, 2015 DR 17112 D. Friedman Only alarm on dedicated radars and
|
||||
* once per detected failure.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -56,18 +59,16 @@ public class RadarWatchdog extends Thread {
|
|||
|
||||
protected static class GsmItem {
|
||||
protected String radarID;
|
||||
protected int vcp;
|
||||
protected long time;
|
||||
protected long alarmTime;
|
||||
protected long nextAlarmTime;
|
||||
protected int trackedVcp;
|
||||
protected int currentVcp;
|
||||
protected boolean failed;
|
||||
|
||||
protected GsmItem() {
|
||||
}
|
||||
}
|
||||
|
||||
protected static class RadarItem {
|
||||
protected String radarID;
|
||||
protected String mnemonic;
|
||||
protected boolean isNew;
|
||||
protected long time;
|
||||
protected long messageTime;
|
||||
|
||||
|
@ -75,7 +76,10 @@ public class RadarWatchdog extends Thread {
|
|||
}
|
||||
}
|
||||
|
||||
private long startTime = 0;
|
||||
protected static class WatchedRadar {
|
||||
|
||||
}
|
||||
|
||||
private long shortestWait = 0;
|
||||
private static final long fudgeTime = 30;
|
||||
|
||||
|
@ -84,13 +88,13 @@ public class RadarWatchdog extends Thread {
|
|||
private static Map<Integer, Integer> mapDuration = new ConcurrentHashMap<Integer, Integer>();
|
||||
private static List<String> mapMnemonicProducts = new ArrayList<String>();
|
||||
|
||||
protected Configuration configuration;
|
||||
protected RadarServer radarServer;
|
||||
private static String configFileName = "radarWatchdog.txt";
|
||||
|
||||
protected RadarWatchdog(Configuration conf) {
|
||||
protected RadarWatchdog(RadarServer radarServer) {
|
||||
super("Watchdog");
|
||||
setDaemon(true);
|
||||
startTime = System.currentTimeMillis();
|
||||
configuration = conf;
|
||||
this.radarServer = radarServer;
|
||||
|
||||
loadConfigFile(configFileName);
|
||||
|
||||
|
@ -102,112 +106,145 @@ public class RadarWatchdog extends Thread {
|
|||
}
|
||||
}
|
||||
|
||||
public GsmItem getGSMItem(final String radarID) {
|
||||
return mapGSM.get(radarID);
|
||||
}
|
||||
|
||||
public void putGSMItem(GsmItem gi) {
|
||||
if (gi != null) {
|
||||
mapGSM.put(gi.radarID, gi);
|
||||
}
|
||||
}
|
||||
|
||||
public RadarItem getRadarItem(final String Mnemonic, final String radarID) {
|
||||
Map<String, RadarItem> mapRadar = mapMnemonic.get(Mnemonic);
|
||||
if (mapRadar != null)
|
||||
return mapRadar.get(radarID);
|
||||
return null;
|
||||
}
|
||||
|
||||
public void putRadarItem(RadarItem ri) {
|
||||
if (ri != null) {
|
||||
Map<String, RadarItem> mapRadar = mapMnemonic.get(ri.mnemonic);
|
||||
if (mapRadar != null) {
|
||||
mapRadar.put(ri.radarID, ri);
|
||||
public synchronized void notifyGsm(String radarID, int vcp) {
|
||||
GsmItem item = mapGSM.get(radarID);
|
||||
if (item != null) {
|
||||
item.currentVcp = vcp;
|
||||
notifyWatchdog();
|
||||
} else {
|
||||
if (isTrackedRadar(radarID)) {
|
||||
item = new GsmItem();
|
||||
item.radarID = radarID;
|
||||
item.currentVcp = vcp;
|
||||
mapGSM.put(radarID, item);
|
||||
notifyWatchdog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean isTrackedRadar(String radarID) {
|
||||
RadarConfig rc = radarServer.getConfiguration().getConfigForRadar(radarID);
|
||||
return rc != null && rc.isDedicated();
|
||||
}
|
||||
|
||||
public synchronized void notifyRadarItem(String radarID, String mnemonic, long messageTime, long time) {
|
||||
if (! isTrackedRadar(radarID))
|
||||
return;
|
||||
|
||||
RadarItem ri = getRadarItem(mnemonic, radarID);
|
||||
if (ri != null) {
|
||||
ri.isNew = false;
|
||||
ri.messageTime = messageTime;
|
||||
ri.time = time;
|
||||
}
|
||||
}
|
||||
|
||||
private RadarItem getRadarItem(final String mnemonic, final String radarID) {
|
||||
Map<String, RadarItem> mapRadar = mapMnemonic.get(mnemonic);
|
||||
if (mapRadar != null) {
|
||||
RadarItem ri = mapRadar.get(radarID);
|
||||
if (ri == null) {
|
||||
ri = new RadarItem();
|
||||
ri.isNew = true;
|
||||
mapRadar.put(radarID, ri);
|
||||
}
|
||||
return ri;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
long currentTime = 0;
|
||||
shortestWait = 0;
|
||||
while (true) {
|
||||
|
||||
try {
|
||||
synchronized (semifore) {
|
||||
semifore.wait(shortestWait < 800 ? 800 : shortestWait);
|
||||
currentTime = System.currentTimeMillis();
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
patrol(currentTime);
|
||||
patrol(System.currentTimeMillis());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void patrol(long currentTime) {
|
||||
private synchronized void patrol(long currentTime) {
|
||||
long duration = 0;
|
||||
long adjustedTime = currentTime - fudgeTime;
|
||||
shortestWait = 0;
|
||||
long earliestCheckTime = 0;
|
||||
Iterator<GsmItem> git = mapGSM.values().iterator();
|
||||
while (git.hasNext()) {
|
||||
GsmItem gi = git.next();
|
||||
if (mapDuration.get(gi.vcp) != null) {
|
||||
duration = mapDuration.get(gi.vcp) * 1000;
|
||||
|
||||
Iterator<String> mnem = mapMnemonicProducts.iterator();
|
||||
while (mnem.hasNext()) {
|
||||
String mn = mnem.next();
|
||||
Map<String, RadarItem> mapRadar = mapMnemonic.get(mn);
|
||||
if (mapRadar == null)
|
||||
continue;
|
||||
RadarItem ri = mapRadar.get(gi.radarID);
|
||||
if (! isTrackedRadar(gi.radarID)) {
|
||||
git.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ri == null) {
|
||||
if (duration + startTime < adjustedTime
|
||||
&& gi.alarmTime != startTime) {
|
||||
alert(duration, gi, mn);
|
||||
gi.alarmTime = startTime;
|
||||
gi.nextAlarmTime = startTime + duration;
|
||||
}
|
||||
|
||||
if (shortestWait < 1 || duration < shortestWait)
|
||||
shortestWait = duration;
|
||||
}
|
||||
/* There will be an alarm when the radar connection goes down, so
|
||||
* do not do any additional alarming.
|
||||
*/
|
||||
RadarStatus rs = radarServer.getStatusManager().getRadarStatus(gi.radarID);
|
||||
if (rs != null && rs.getCurrentGSM() == null) {
|
||||
gi.trackedVcp = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (gi.currentVcp != gi.trackedVcp) {
|
||||
for (String mn : mapMnemonicProducts) {
|
||||
RadarItem ri = getRadarItem(mn, gi.radarID);
|
||||
if (ri != null) {
|
||||
ri.isNew = true;
|
||||
}
|
||||
}
|
||||
gi.trackedVcp = gi.currentVcp;
|
||||
}
|
||||
|
||||
if (ri.time + duration < adjustedTime) {
|
||||
if (ri.time <= gi.alarmTime
|
||||
&& gi.nextAlarmTime < currentTime) {
|
||||
alert(duration, gi, ri.mnemonic);
|
||||
gi.alarmTime = ri.time;
|
||||
gi.nextAlarmTime = currentTime + duration;
|
||||
}
|
||||
if (gi.nextAlarmTime < currentTime)
|
||||
gi.alarmTime = ri.time;
|
||||
}
|
||||
if (mapDuration.get(gi.trackedVcp) != null) {
|
||||
boolean allOk = true;
|
||||
duration = (mapDuration.get(gi.trackedVcp) + fudgeTime) * 1000;
|
||||
|
||||
if ((duration + ri.time) - adjustedTime < shortestWait
|
||||
&& 1 <= (duration + ri.time) - adjustedTime)
|
||||
shortestWait = (duration + ri.time) - adjustedTime;
|
||||
if (shortestWait < 1)
|
||||
shortestWait = duration;
|
||||
for (String mn : mapMnemonicProducts) {
|
||||
RadarItem ri = getRadarItem(mn, gi.radarID);
|
||||
if (ri == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ri.isNew) {
|
||||
ri.isNew = false;
|
||||
ri.time = currentTime;
|
||||
} else {
|
||||
long diff = currentTime - ri.time;
|
||||
if (diff < duration) {
|
||||
long nextTime = ri.time + duration;
|
||||
if (earliestCheckTime == 0 || nextTime < earliestCheckTime) {
|
||||
earliestCheckTime = nextTime;
|
||||
}
|
||||
} else {
|
||||
allOk = false;
|
||||
alert(duration, gi, mn);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (allOk) {
|
||||
gi.failed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shortestWait = earliestCheckTime > 0 ? earliestCheckTime - currentTime : 0;
|
||||
}
|
||||
|
||||
private void alert(final long duration, final GsmItem gi, final String mn) {
|
||||
String AlertVizMessage = "Watchdog: Radar ";
|
||||
AlertVizMessage += gi.radarID + " has not produced a '" + mn
|
||||
+ "' product in the last " + duration / 1000 + " seconds.";
|
||||
RadarServerAvailable.sendNotification(gi.radarID, AlertVizMessage);
|
||||
if (! gi.failed) {
|
||||
gi.failed = true;
|
||||
String AlertVizMessage = "Watchdog: Radar ";
|
||||
AlertVizMessage += gi.radarID + " has not produced a '" + mn
|
||||
+ "' product in the last " + duration / 1000 + " seconds.";
|
||||
RadarServerAvailable.sendNotification(gi.radarID, AlertVizMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public void notifyWatchdog() {
|
||||
|
@ -218,7 +255,8 @@ public class RadarWatchdog extends Thread {
|
|||
|
||||
private boolean loadConfigFile(final String filename) {
|
||||
try {
|
||||
InputStream inFile = configuration.getDropInData(filename);
|
||||
InputStream inFile = radarServer.getConfiguration().
|
||||
getDropInData(filename);
|
||||
InputStreamReader reader = new InputStreamReader(inFile);
|
||||
BufferedReader in = new BufferedReader(reader);
|
||||
String line;
|
||||
|
|
|
@ -44,6 +44,8 @@ import com.raytheon.rcm.server.RadarWatchdog;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------- ---------- ----------- --------------------------
|
||||
* May 12, 2014 DR 16319 dhuffman Initial creation.
|
||||
* Feb 10, 2015 DR 17112 D. Friedman Only alarm on dedicated radars and
|
||||
* once per detected failure.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -61,8 +63,8 @@ public class RadarWatchdogListener extends RadarEventAdapter {
|
|||
mnemonicMap.put("HSW", "SW");
|
||||
}
|
||||
|
||||
public RadarWatchdogListener(Configuration configuration) {
|
||||
radarWatchdog = new RadarWatchdog(configuration);
|
||||
public RadarWatchdogListener(RadarServer radarServer) {
|
||||
radarWatchdog = new RadarWatchdog(radarServer);
|
||||
radarWatchdog.start();
|
||||
}
|
||||
|
||||
|
@ -81,25 +83,14 @@ public class RadarWatchdogListener extends RadarEventAdapter {
|
|||
}
|
||||
|
||||
if (gsm != null) {
|
||||
RadarWatchdog.GsmItem gi = new RadarWatchdog.GsmItem();
|
||||
gi.radarID = event.getRadarID();
|
||||
gi.vcp = gsm.vcp;
|
||||
gi.time = gsm.time.getTimeInMillis();
|
||||
|
||||
RadarWatchdog.GsmItem oldgi = radarWatchdog
|
||||
.getGSMItem(gi.radarID);
|
||||
if (oldgi == null
|
||||
|| (oldgi != null && oldgi.time <= gi.time)) {
|
||||
radarWatchdog.putGSMItem(gi);
|
||||
}
|
||||
radarWatchdog.notifyGsm(event.getRadarID(), gsm.vcp);
|
||||
}
|
||||
|
||||
} else if (16 <= messageCode) {
|
||||
int mcode = 0;
|
||||
PDB pdb = null;
|
||||
RadarWatchdog.RadarItem ri = new RadarWatchdog.RadarItem();
|
||||
mcode = Message.messageCodeOf(msg);
|
||||
ri.messageTime = (Message.decodeHeader(msg).time)
|
||||
long messageTime = (Message.decodeHeader(msg).time)
|
||||
.getTimeInMillis();
|
||||
|
||||
RadarProduct rp = ProductInfo.getInstance().getPoductForCode(
|
||||
|
@ -107,10 +98,9 @@ public class RadarWatchdogListener extends RadarEventAdapter {
|
|||
if (rp == null)
|
||||
return;
|
||||
|
||||
ri.mnemonic = rp.mnemonic;
|
||||
String newMnemonic = mnemonicMap.get(ri.mnemonic);
|
||||
if (newMnemonic != null)
|
||||
ri.mnemonic = newMnemonic;
|
||||
String mnemonic = mnemonicMap.get(rp.mnemonic);
|
||||
if (mnemonic == null)
|
||||
mnemonic = rp.mnemonic;
|
||||
|
||||
try {
|
||||
pdb = GraphicProduct.pdbOfMessage(msg);
|
||||
|
@ -120,17 +110,8 @@ public class RadarWatchdogListener extends RadarEventAdapter {
|
|||
}
|
||||
|
||||
if (pdb != null) {
|
||||
ri.radarID = event.getRadarID();
|
||||
ri.time = System.currentTimeMillis();
|
||||
|
||||
RadarWatchdog.RadarItem oldri = radarWatchdog.getRadarItem(
|
||||
ri.mnemonic, ri.radarID);
|
||||
|
||||
if (oldri == null
|
||||
|| (oldri != null && oldri.messageTime <= ri.messageTime)) {
|
||||
radarWatchdog.putRadarItem(ri);
|
||||
radarWatchdog.notifyWatchdog();
|
||||
}
|
||||
radarWatchdog.notifyRadarItem(event.getRadarID(), mnemonic,
|
||||
messageTime, System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ import com.raytheon.viz.ui.EditorUtil;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* May 2009 # bsteffen Initial creation
|
||||
* Nov 2013 # mccaslin Only one GUI dialog at a time
|
||||
* Oct 2014 # mccaslin Improved error handeling
|
||||
* Oct 2014 # mccaslin Improved error handeling
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -56,7 +56,8 @@ import com.raytheon.viz.ui.EditorUtil;
|
|||
* @version 1.0
|
||||
*/
|
||||
public class LapsToolsAction extends AbstractHandler {
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(LapsToolsAction.class);
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||
.getHandler(LapsToolsAction.class);
|
||||
|
||||
/**
|
||||
* LAPS Tools dialog.
|
||||
|
@ -65,50 +66,49 @@ public class LapsToolsAction extends AbstractHandler {
|
|||
|
||||
public static LAPSToolsDlg getLapsToolsDlg() {
|
||||
return lapsToolsDlg;
|
||||
}
|
||||
}
|
||||
|
||||
public Object execute(ExecutionEvent arg0) throws ExecutionException {
|
||||
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
|
||||
.getShell();
|
||||
|
||||
|
||||
if (lapsToolsDlg == null) {
|
||||
try {
|
||||
lapsToolsDlg = new LAPSToolsDlg(shell);
|
||||
lapsToolsDlg.addListener(SWT.Dispose, new Listener() {
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
lapsToolsDlg = null;
|
||||
}
|
||||
});
|
||||
|
||||
if (lapsToolsDlg.isLapsInstalled()) {
|
||||
lapsToolsDlg.open();
|
||||
} else {
|
||||
String whatLapsIs ="LAPS data assimilation system, system requirements: " +
|
||||
"\n\to LAPS v2.0 installed" +
|
||||
"\n\to EDEX 'SITE' file containing LAPS domain, i.e. domain.xml" +
|
||||
"\n\n\n(Sorry LAPS does not work in the ADAM implementation of AWIPS.)";
|
||||
//Note: Go through the LAPS v2.0 Scripting Interface first, if you find that LAPS is not installed.
|
||||
|
||||
MessageBox mb = new MessageBox(EditorUtil.getActiveEditor().getSite().getShell(), SWT.ICON_WARNING | SWT.OK);
|
||||
mb.setText("Cannot open LAPS V2.0 Tools GUI");
|
||||
mb.setMessage(whatLapsIs);
|
||||
mb.open();
|
||||
lapsToolsDlg = null;
|
||||
lapsToolsDlg = new LAPSToolsDlg(shell);
|
||||
lapsToolsDlg.addListener(SWT.Dispose, new Listener() {
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
lapsToolsDlg = null;
|
||||
}
|
||||
});
|
||||
|
||||
//int val = mb.open();
|
||||
//if (val == SWT.OK) {
|
||||
// AlertViz Customization Update
|
||||
//return false;
|
||||
//}
|
||||
if (lapsToolsDlg.isLapsInstalled()) {
|
||||
lapsToolsDlg.open();
|
||||
} else {
|
||||
String whatLapsIs = "LAPS is not installed. ";
|
||||
// Note: Go through the LAPS v2.0 Scripting Interface first,
|
||||
// if you find that LAPS is not installed.
|
||||
|
||||
}
|
||||
MessageBox mb = new MessageBox(EditorUtil.getActiveEditor()
|
||||
.getSite().getShell(), SWT.ICON_ERROR | SWT.OK);
|
||||
mb.setText("Cannot open the LAPS tool");
|
||||
mb.setMessage(whatLapsIs);
|
||||
mb.open();
|
||||
lapsToolsDlg = null;
|
||||
|
||||
// int val = mb.open();
|
||||
// if (val == SWT.OK) {
|
||||
// AlertViz Customization Update
|
||||
// return false;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
} catch (VizException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error: Cannot open LAPS V2.0 Tools GUI", e);
|
||||
}
|
||||
|
||||
} catch (VizException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error: Cannot open LAPS V2.0 Tools GUI", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
|
|
|
@ -5,6 +5,7 @@ import java.io.File;
|
|||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
@ -27,6 +28,7 @@ import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel
|
|||
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
|
||||
import com.raytheon.uf.common.localization.LocalizationFile;
|
||||
import com.raytheon.uf.common.localization.PathManagerFactory;
|
||||
import com.raytheon.uf.common.localization.exception.LocalizationException;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.common.time.SimulatedTime;
|
||||
|
@ -36,8 +38,8 @@ import com.raytheon.viz.awipstools.ui.action.LapsToolsData.LapsDomain;
|
|||
import com.vividsolutions.jts.geom.Envelope;
|
||||
|
||||
/**
|
||||
* This class no longer performs all the file system, server input/output for laps.
|
||||
* LAPS support scripts now conduct the localization process.
|
||||
* This class no longer performs all the file system, server input/output for
|
||||
* laps. LAPS support scripts now conduct the localization process.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
|
@ -55,147 +57,150 @@ import com.vividsolutions.jts.geom.Envelope;
|
|||
*/
|
||||
public class LapsToolsIO {
|
||||
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(LapsToolsIO.class);
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||
.getHandler(LapsToolsIO.class);
|
||||
|
||||
private static final String WHATGOTIN_FILE_FRMT = "%s/%s.wgi";
|
||||
|
||||
private static File fxaData;
|
||||
|
||||
private static File lapsLogs;
|
||||
|
||||
|
||||
private static List<String> whatgotinFiles;
|
||||
|
||||
private static List<String> dataChoices;
|
||||
|
||||
|
||||
static {
|
||||
// TODO all this configuration should be customizable by the user.
|
||||
// --- For what got in log files ---
|
||||
// --- For what got in log files ---
|
||||
if (System.getenv("FXA_DATA") == null) {
|
||||
fxaData = new File("/data/fxa");
|
||||
fxaData = new File("/data/fxa");
|
||||
} else {
|
||||
fxaData = new File(System.getenv("FXA_DATA"));
|
||||
}
|
||||
lapsLogs = new File(fxaData + "/laps/log/wgi");
|
||||
whatgotinFiles = Arrays.asList("sfc", "wind", "lq3driver", "cloud", "temp");
|
||||
dataChoices = Arrays.asList("Surface Analysis",
|
||||
"Wind Analysis",
|
||||
"Humidity Analysis",
|
||||
"Cloud Analysis",
|
||||
"Temperature Analysis");
|
||||
whatgotinFiles = Arrays.asList("sfc", "wind", "lq3driver", "cloud",
|
||||
"temp");
|
||||
dataChoices = Arrays.asList("Surface Analysis", "Wind Analysis",
|
||||
"Humidity Analysis", "Cloud Analysis", "Temperature Analysis");
|
||||
}
|
||||
|
||||
public static Collection<String> getDataChoices() {
|
||||
return dataChoices;
|
||||
}
|
||||
|
||||
public static String getLogs(String type) throws IOException,
|
||||
VizException {
|
||||
public static String getLogs(String type) throws IOException, VizException {
|
||||
String wgiFile = String.format(WHATGOTIN_FILE_FRMT, lapsLogs,
|
||||
whatgotinFiles.get(dataChoices.indexOf(type)));
|
||||
whatgotinFiles.get(dataChoices.indexOf(type)));
|
||||
String resultIO = loadWhatGotInFile(wgiFile, type);
|
||||
return (resultIO);
|
||||
return (resultIO);
|
||||
}
|
||||
|
||||
private static String loadWhatGotInFile(String wfile, String type)
|
||||
throws IOException {
|
||||
BufferedReader reader;
|
||||
StringBuilder output = new StringBuilder();
|
||||
File file = new File(wfile);
|
||||
|
||||
try {
|
||||
reader = new BufferedReader(new FileReader(file));
|
||||
} catch (FileNotFoundException e) {
|
||||
String arg = String.format("*** Cannot find expected log file for %s." +
|
||||
"\n*** File %s ....does not appear to exist.\n\n",
|
||||
type, file.getAbsolutePath());
|
||||
output.append(arg);
|
||||
return output.toString();
|
||||
}
|
||||
private static String loadWhatGotInFile(String wfile, String type)
|
||||
throws IOException {
|
||||
BufferedReader reader;
|
||||
StringBuilder output = new StringBuilder();
|
||||
File file = new File(wfile);
|
||||
|
||||
try {
|
||||
reader = new BufferedReader(new FileReader(file));
|
||||
} catch (FileNotFoundException e) {
|
||||
String arg = String
|
||||
.format("*** Cannot find expected log file for %s."
|
||||
+ "\n*** File %s ....does not appear to exist.\n\n",
|
||||
type, file.getAbsolutePath());
|
||||
output.append(arg);
|
||||
return output.toString();
|
||||
}
|
||||
String line;
|
||||
int lineNumber = 0;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
String arg = String.format("%04d: %s%n", ++lineNumber, line);
|
||||
output.append(arg);
|
||||
output.append(arg);
|
||||
}
|
||||
reader.close();
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
|
||||
public static LapsToolsData loadData() throws IOException, VizException,
|
||||
SpatialException {
|
||||
LapsToolsData data = new LapsToolsData();
|
||||
if(LapsToolsIO.readXmlFile(data)) {
|
||||
LapsToolsIO.readCountyWarningArea(data);
|
||||
if (LapsToolsIO.readXmlFile(data)) {
|
||||
LapsToolsIO.readCountyWarningArea(data);
|
||||
} else {
|
||||
data = null;
|
||||
data = null;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
public static boolean readXmlFile(LapsToolsData data)
|
||||
throws IOException, VizException {
|
||||
|
||||
|
||||
public static boolean readXmlFile(LapsToolsData data) throws IOException,
|
||||
VizException {
|
||||
|
||||
IPathManager pm = PathManagerFactory.getPathManager();
|
||||
LocalizationContext lc = pm.getContext(LocalizationType.COMMON_STATIC,
|
||||
LocalizationLevel.SITE);
|
||||
LocalizationFile xmlLocalizationFile = pm.getLocalizationFile(lc, "LAPS/domain" +
|
||||
".xml");
|
||||
if(!xmlLocalizationFile.exists()) return false;
|
||||
|
||||
LapsDomain domain = new LapsDomain();
|
||||
try {
|
||||
JAXBContext jaxbContext = JAXBContext.newInstance(LapsDomain.class);
|
||||
//unmarshal XML file to java object
|
||||
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
|
||||
domain = (LapsDomain) jaxbUnmarshaller.unmarshal(xmlLocalizationFile.getFile());
|
||||
|
||||
} catch (JAXBException e) {
|
||||
throw new VizException("xml is unreadable: "+e.getLocalizedMessage());
|
||||
}
|
||||
|
||||
LocalizationContext lc = pm.getContext(LocalizationType.COMMON_STATIC,
|
||||
LocalizationLevel.SITE);
|
||||
LocalizationFile xmlLocalizationFile = pm.getLocalizationFile(lc,
|
||||
"LAPS/domain" + ".xml");
|
||||
if (!xmlLocalizationFile.exists())
|
||||
return false;
|
||||
|
||||
LapsDomain domain = new LapsDomain();
|
||||
try {
|
||||
JAXBContext jaxbContext = JAXBContext.newInstance(LapsDomain.class);
|
||||
// unmarshal XML file to java object
|
||||
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
|
||||
domain = (LapsDomain) jaxbUnmarshaller
|
||||
.unmarshal(xmlLocalizationFile.getFile());
|
||||
|
||||
} catch (JAXBException e) {
|
||||
throw new VizException("xml is unreadable: "
|
||||
+ e.getLocalizedMessage());
|
||||
}
|
||||
|
||||
data.setNx(domain.getNx());
|
||||
data.setNy(domain.getNy());
|
||||
data.setNz(domain.getNz());
|
||||
data.setGridSpacing(domain.getGridSpacing());
|
||||
data.setGridCenterLon(domain.getGridCenLon());
|
||||
data.setGridCenterLat(domain.getGridCenLat());
|
||||
data.setGridCenterLat(domain.getGridCenLat());
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void defaultDomain(LapsToolsData data)
|
||||
throws IOException, VizException {
|
||||
double distance = 111; //111 km per 1 degree
|
||||
double gridSpacingDefault = 3500.;
|
||||
public static void defaultDomain(LapsToolsData data) throws IOException,
|
||||
VizException {
|
||||
double distance = 111; // 111 km per 1 degree
|
||||
double gridSpacingDefault = 3500.;
|
||||
double dim = 200;
|
||||
double N = dim * dim;
|
||||
|
||||
|
||||
Envelope shapeArea = data.getValidAreaOrig();
|
||||
double widthY = Math.abs(shapeArea.getHeight() * distance);
|
||||
double widthX = Math.abs( (shapeArea.getWidth() * distance) * (Math.cos(shapeArea.centre().x) ) );
|
||||
double widthX = Math.abs((shapeArea.getWidth() * distance)
|
||||
* (Math.cos(shapeArea.centre().x)));
|
||||
double aspectRatio = widthY / widthX;
|
||||
double buffer = 0.5;
|
||||
int nX = (int) (Math.sqrt(N/aspectRatio) + buffer);
|
||||
int nX = (int) (Math.sqrt(N / aspectRatio) + buffer);
|
||||
int nY = (int) ((aspectRatio * nX) + buffer);
|
||||
|
||||
System.out.print("LAPS Tools IO:\nheight = "+shapeArea.getHeight()+ " width = "+shapeArea.getWidth());
|
||||
System.out.print("\naspect ratio = "+aspectRatio);
|
||||
System.out.print("\nnX = "+nX+", nY = "+nY+"\n");
|
||||
|
||||
LapsDomain domain = new LapsDomain();
|
||||
System.out.print("LAPS Tools IO:\nheight = " + shapeArea.getHeight()
|
||||
+ " width = " + shapeArea.getWidth());
|
||||
System.out.print("\naspect ratio = " + aspectRatio);
|
||||
System.out.print("\nnX = " + nX + ", nY = " + nY + "\n");
|
||||
|
||||
LapsDomain domain = new LapsDomain();
|
||||
domain.setNx(nX);
|
||||
domain.setNy(nY);
|
||||
domain.setNz(43);
|
||||
domain.setGridSpacing(gridSpacingDefault);
|
||||
domain.setGridCenLon(data.getCwaCenter().x);
|
||||
domain.setGridCenLat(data.getCwaCenter().y);
|
||||
|
||||
domain.setGridCenLat(data.getCwaCenter().y);
|
||||
|
||||
data.setNx(domain.getNx());
|
||||
data.setNy(domain.getNy());
|
||||
data.setNz(domain.getNz());
|
||||
data.setGridSpacing(domain.getGridSpacing());
|
||||
data.setGridCenterLon(data.getCwaCenter().x);
|
||||
data.setGridCenterLat(data.getCwaCenter().y);
|
||||
data.setGridCenterLat(data.getCwaCenter().y);
|
||||
}
|
||||
|
||||
private static void readCountyWarningArea(LapsToolsData data)
|
||||
|
@ -209,23 +214,25 @@ public class LapsToolsIO {
|
|||
return;
|
||||
}
|
||||
data.setCwaArea(result[0].geometry.getEnvelopeInternal());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static String getWriteXmlQuestion() {
|
||||
String date = new SimpleDateFormat("HH:mm").format(SimulatedTime
|
||||
.getSystemTime().getTime());
|
||||
return String.format("Are you sure you want write domain.xml?" +
|
||||
"\nNote: Its %s and LAPS runs at ~20 minutes after the hour.",date);
|
||||
return String
|
||||
.format("Are you sure you want write domain.xml?"
|
||||
+ "\nNote: Its %s and LAPS runs at ~20 minutes after the hour.",
|
||||
date);
|
||||
}
|
||||
|
||||
public static void writeXmlFile(LapsToolsData data) throws IOException,
|
||||
InterruptedException, VizException {
|
||||
|
||||
IPathManager pm = PathManagerFactory.getPathManager();
|
||||
LocalizationContext lc = pm.getContext(LocalizationType.COMMON_STATIC,
|
||||
LocalizationLevel.SITE);
|
||||
LocalizationFile xmlLocalizationFile = pm.getLocalizationFile(lc, "LAPS/domain-output" +
|
||||
".xml");
|
||||
|
||||
IPathManager pm = PathManagerFactory.getPathManager();
|
||||
LocalizationContext lc = pm.getContext(LocalizationType.COMMON_STATIC,
|
||||
LocalizationLevel.USER);
|
||||
LocalizationFile xmlLocalizationFile = pm.getLocalizationFile(lc,
|
||||
"LAPS" + IPathManager.SEPARATOR + "domain.xml");
|
||||
LapsDomain lapsdomain = new LapsDomain();
|
||||
lapsdomain.setNx(data.getNx());
|
||||
lapsdomain.setNy(data.getNy());
|
||||
|
@ -233,7 +240,15 @@ public class LapsToolsIO {
|
|||
lapsdomain.setGridSpacing(data.getGridSpacing());
|
||||
lapsdomain.setGridCenLat(data.getGridCenter().y);
|
||||
lapsdomain.setGridCenLon(data.getGridCenter().x);
|
||||
//marshal java object to XML file
|
||||
JAXB.marshal(lapsdomain, xmlLocalizationFile.getFile());
|
||||
// marshal java object to XML file
|
||||
OutputStream stream;
|
||||
try {
|
||||
stream = xmlLocalizationFile.openOutputStream();
|
||||
JAXB.marshal(lapsdomain, stream);
|
||||
stream.close();
|
||||
xmlLocalizationFile.save();
|
||||
} catch (LocalizationException e) {
|
||||
throw new VizException("Unable to save LapsDomain to xml.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -77,8 +77,9 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
|
|||
* @version 1.0
|
||||
*/
|
||||
public class LAPSToolsDlg extends CaveSWTDialog {
|
||||
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(LAPSToolsDlg.class);
|
||||
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||
.getHandler(LAPSToolsDlg.class);
|
||||
|
||||
private final LapsToolsData data;
|
||||
|
||||
|
@ -109,7 +110,7 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
*/
|
||||
private boolean isLapsInstalled = false;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Flag indicating which tool is active.
|
||||
*/
|
||||
private boolean isDataUsedByAnalysis = true;
|
||||
|
@ -175,9 +176,9 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
*/
|
||||
private StackLayout stackLayout;
|
||||
|
||||
private MessageBox areaDialog;
|
||||
private MessageBox areaDialog;
|
||||
|
||||
private Label areaStrLbl;
|
||||
private Label areaStrLbl;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
|
@ -192,16 +193,15 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
|
||||
try {
|
||||
this.data = LapsToolsIO.loadData();
|
||||
if(data==null){
|
||||
isLapsInstalled = false;
|
||||
if (data == null) {
|
||||
isLapsInstalled = false;
|
||||
} else {
|
||||
isLapsInstalled = true;
|
||||
isLapsInstalled = true;
|
||||
}
|
||||
|
||||
|
||||
} catch (VizException e) {
|
||||
MessageDialog
|
||||
.openInformation(shell, "LAPS Tools GUI cannot run.",
|
||||
e.getLocalizedMessage());
|
||||
MessageDialog.openInformation(shell, "LAPS Tools GUI cannot run.",
|
||||
e.getLocalizedMessage());
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
throw new VizException("Laps Dialog Failed to open", e);
|
||||
|
@ -242,8 +242,7 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
createMainControls();
|
||||
|
||||
// create dialog with OK and cancel button and info icon
|
||||
areaDialog =
|
||||
new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
|
||||
areaDialog = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
|
||||
areaDialog.setText("Size of LAPS Domain");
|
||||
}
|
||||
|
||||
|
@ -352,27 +351,27 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
// Create the Help menu item with a Help "dropdown" menu
|
||||
Menu helpMenu = new Menu(menuBar);
|
||||
helpMenuItem.setMenu(helpMenu);
|
||||
|
||||
|
||||
// create dialog with OK and cancel button and info icon
|
||||
final MessageBox dialog =
|
||||
new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
|
||||
final MessageBox dialog = new MessageBox(shell, SWT.ICON_INFORMATION
|
||||
| SWT.OK);
|
||||
dialog.setText("About LAPS details");
|
||||
dialog.setMessage("For additional detailed information about LAPS Tools go to the URL" +
|
||||
"\n\t http://laps.noaa.gov/awipsii/");
|
||||
|
||||
dialog.setMessage("For additional detailed information about LAPS Tools go to the URL"
|
||||
+ "\n\t http://laps.noaa.gov/awipsii/");
|
||||
|
||||
// ------------------------------------------------------
|
||||
// Create all the items in the Help dropdown menu
|
||||
// ------------------------------------------------------
|
||||
|
||||
// Administration menu item
|
||||
// Administration menu item
|
||||
MenuItem aboutMI = new MenuItem(helpMenu, SWT.NONE);
|
||||
aboutMI.setText("About LAPS...");
|
||||
aboutMI.addSelectionListener(new SelectionAdapter() {
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
dialog.open();
|
||||
dialog.open();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -430,22 +429,24 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
Combo c = (Combo) e.widget;
|
||||
if(c.getSelectionIndex() == 0 && c.getItem(0) == "-- Select a Type --") {
|
||||
//no action
|
||||
} else if(c.getSelectionIndex() != 0 && c.getItem(0) == "-- Select a Type --") {
|
||||
c.remove(0);
|
||||
typeAction((c.getItem(c.getSelectionIndex())));
|
||||
if (c.getSelectionIndex() == 0
|
||||
&& c.getItem(0) == "-- Select a Type --") {
|
||||
// no action
|
||||
} else if (c.getSelectionIndex() != 0
|
||||
&& c.getItem(0) == "-- Select a Type --") {
|
||||
c.remove(0);
|
||||
typeAction((c.getItem(c.getSelectionIndex())));
|
||||
} else {
|
||||
typeAction((c.getItem(c.getSelectionIndex())));
|
||||
typeAction((c.getItem(c.getSelectionIndex())));
|
||||
}
|
||||
}
|
||||
});
|
||||
typeCbo.select(0);
|
||||
typeCbo.setToolTipText("Select one of the options to see what got into this LAPS product." );
|
||||
|
||||
typeCbo.setToolTipText("Select one of the options to see what got into this LAPS product.");
|
||||
|
||||
Label blank = new Label(controlComp, SWT.NONE);
|
||||
blank.setText(" ");
|
||||
|
||||
|
||||
Button clearBtn = new Button(controlComp, SWT.PUSH);
|
||||
clearBtn.setText(" Clear ");
|
||||
clearBtn.addSelectionListener(new SelectionAdapter() {
|
||||
|
@ -455,7 +456,7 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
}
|
||||
});
|
||||
clearBtn.setToolTipText("Clear screen.");
|
||||
|
||||
|
||||
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
|
||||
gd.widthHint = 500;
|
||||
gd.heightHint = 300;
|
||||
|
@ -491,12 +492,13 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
writeDomainBtn.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
writeXmlfileAction();
|
||||
writeXmlfileAction();
|
||||
}
|
||||
});
|
||||
writeDomainBtn.setToolTipText("Write LAPS domain.xml file AND Exit.\n" +
|
||||
"This step will cause scripts to run that redefine the LAPS domain.\n" +
|
||||
"Next cycle of the analysis will show the change in domain made here." );
|
||||
writeDomainBtn
|
||||
.setToolTipText("Write LAPS domain.xml file AND Exit.\n"
|
||||
+ "This step will cause scripts to run that redefine the LAPS domain.\n"
|
||||
+ "Next cycle of the analysis will show the change in domain made here.");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -606,36 +608,31 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
nxSpnr.setEnabled(true);
|
||||
nxSpnr.setLayoutData(gd);
|
||||
nxSpnr.addListener(SWT.Verify, new Listener() {
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
data.setNx(nxSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
data.setNx(nxSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
});
|
||||
/*nxSpnr.addFocusListener(new FocusListener() {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
data.setNx(nxSpnr.getSelection());
|
||||
//areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void focusLost(FocusEvent e) {
|
||||
data.setNx(nxSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
});
|
||||
nxSpnr.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
data.setNx(nxSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent e) {
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
/*
|
||||
* nxSpnr.addFocusListener(new FocusListener() {
|
||||
*
|
||||
* @Override public void focusGained(FocusEvent e) {
|
||||
* data.setNx(nxSpnr.getSelection());
|
||||
* //areaStrLbl.setText(data.getAreaCoverageString()); }
|
||||
*
|
||||
* @Override public void focusLost(FocusEvent e) {
|
||||
* data.setNx(nxSpnr.getSelection());
|
||||
* areaStrLbl.setText(data.getAreaCoverageString()); } });
|
||||
* nxSpnr.addSelectionListener(new SelectionListener() {
|
||||
*
|
||||
* @Override public void widgetSelected(SelectionEvent e) {
|
||||
* data.setNx(nxSpnr.getSelection());
|
||||
* areaStrLbl.setText(data.getAreaCoverageString()); }
|
||||
*
|
||||
* @Override public void widgetDefaultSelected(SelectionEvent e) { } });
|
||||
*/
|
||||
|
||||
/*
|
||||
* Ny
|
||||
*/
|
||||
|
@ -655,23 +652,21 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
nySpnr.setEnabled(true);
|
||||
nySpnr.setLayoutData(gd);
|
||||
nySpnr.addListener(SWT.Verify, new Listener() {
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
data.setNy(nySpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
data.setNy(nySpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
});
|
||||
/*nySpnr.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
data.setNy(nySpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent e) {
|
||||
}
|
||||
});
|
||||
*/
|
||||
/*
|
||||
* nySpnr.addSelectionListener(new SelectionListener() {
|
||||
*
|
||||
* @Override public void widgetSelected(SelectionEvent e) {
|
||||
* data.setNy(nySpnr.getSelection());
|
||||
* areaStrLbl.setText(data.getAreaCoverageString()); }
|
||||
*
|
||||
* @Override public void widgetDefaultSelected(SelectionEvent e) { } });
|
||||
*/
|
||||
/*
|
||||
* Dx(m)
|
||||
*/
|
||||
|
@ -691,23 +686,21 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
dxmSpnr.setLayoutData(gd);
|
||||
dxmSpnr.setMinimum(1000);
|
||||
dxmSpnr.addListener(SWT.Verify, new Listener() {
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
data.setGridSpacing((double) dxmSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
data.setGridSpacing((double) dxmSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
});
|
||||
/*dxmSpnr.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
data.setGridSpacing((double) dxmSpnr.getSelection());
|
||||
areaStrLbl.setText(data.getAreaCoverageString());
|
||||
}
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent e) {
|
||||
}
|
||||
});
|
||||
*/
|
||||
/*
|
||||
* dxmSpnr.addSelectionListener(new SelectionListener() {
|
||||
*
|
||||
* @Override public void widgetSelected(SelectionEvent e) {
|
||||
* data.setGridSpacing((double) dxmSpnr.getSelection());
|
||||
* areaStrLbl.setText(data.getAreaCoverageString()); }
|
||||
*
|
||||
* @Override public void widgetDefaultSelected(SelectionEvent e) { } });
|
||||
*/
|
||||
/*
|
||||
* Vertical label
|
||||
*/
|
||||
|
@ -744,7 +737,6 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
gridGroup.setLayout(new GridLayout(1, false));
|
||||
gridGroup.setLayoutData(gd);
|
||||
gridGroup.setText(" Area of Coverage ");
|
||||
|
||||
|
||||
/*
|
||||
* Calculated Area label
|
||||
|
@ -768,7 +760,8 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
|
||||
Composite groupComp = new Composite(configureAnalysisComp, SWT.NONE);
|
||||
groupComp.setLayout(gl);
|
||||
groupComp.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
|
||||
groupComp
|
||||
.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
|
||||
|
||||
/*
|
||||
* Settings
|
||||
|
@ -790,8 +783,9 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
setDefaultDomain();
|
||||
}
|
||||
});
|
||||
//defaultBtn.setToolTipText("Set to the default");
|
||||
defaultBtn.setToolTipText("Reset all variables to values so that the LAPS domain will fully include the CWA area");
|
||||
// defaultBtn.setToolTipText("Set to the default");
|
||||
defaultBtn
|
||||
.setToolTipText("Reset all variables to values so that the LAPS domain will fully include the CWA area");
|
||||
|
||||
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
|
||||
gd.widthHint = buttonWidth;
|
||||
|
@ -804,8 +798,8 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
resetDomain();
|
||||
}
|
||||
});
|
||||
resetBtn.setToolTipText("Set to the values that you started with" );
|
||||
|
||||
resetBtn.setToolTipText("Set to the values that you started with");
|
||||
|
||||
/*
|
||||
* LAPS Relocator
|
||||
*/
|
||||
|
@ -826,8 +820,8 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
loadAction();
|
||||
}
|
||||
});
|
||||
loadBtn.setToolTipText("Load the grid info into the display." +
|
||||
"\nRelocate the domain by selecting and moving the grid center.");
|
||||
loadBtn.setToolTipText("Load the grid info into the display."
|
||||
+ "\nRelocate the domain by selecting and moving the grid center.");
|
||||
|
||||
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
|
||||
gd.widthHint = buttonWidth;
|
||||
|
@ -841,8 +835,8 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
applyAction();
|
||||
}
|
||||
});
|
||||
applyBtn.setToolTipText("Fill the selectors with new values, if you" +
|
||||
"\nmoved the domain by relocating the center point." );
|
||||
applyBtn.setToolTipText("Fill the selectors with new values, if you"
|
||||
+ "\nmoved the domain by relocating the center point.");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -880,29 +874,29 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
|
||||
private void populateTypeCombo(Combo combo) {
|
||||
combo.add("-- Select a Type --");
|
||||
for (String choice : LapsToolsIO.getDataChoices()) {
|
||||
for (String choice : LapsToolsIO.getDataChoices()) {
|
||||
combo.add(choice);
|
||||
}
|
||||
}
|
||||
|
||||
private void typeAction(String type) {
|
||||
try {
|
||||
stText.append("Begin "+type+"\n");
|
||||
stText.append("Begin " + type + "\n");
|
||||
stText.append(LapsToolsIO.getLogs(type));
|
||||
stText.append("End of "+type);
|
||||
stText.append("End of " + type);
|
||||
stText.append("\n__________________________________________\n\n");
|
||||
stText.setTopIndex(stText.getLineCount());
|
||||
} catch (Exception ex) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
ex.getLocalizedMessage(), ex);
|
||||
statusHandler
|
||||
.handle(Priority.PROBLEM, ex.getLocalizedMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void populateSpinners() {
|
||||
configureSpinner(cenLatSpnr, data.getGridCenter().y,
|
||||
data.getValidArea().getMinY(), data.getValidArea().getMaxY());
|
||||
configureSpinner(cenLonSpnr, data.getGridCenter().x,
|
||||
data.getValidArea().getMinX(), data.getValidArea().getMaxX());
|
||||
configureSpinner(cenLatSpnr, data.getGridCenter().y, data
|
||||
.getValidArea().getMinY(), data.getValidArea().getMaxY());
|
||||
configureSpinner(cenLonSpnr, data.getGridCenter().x, data
|
||||
.getValidArea().getMinX(), data.getValidArea().getMaxX());
|
||||
configureSpinner(nxSpnr, data.getNx());
|
||||
configureSpinner(nySpnr, data.getNy());
|
||||
configureSpinner(dxmSpnr, data.getGridSpacing());
|
||||
|
@ -945,14 +939,16 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
|
||||
private void setDefaultDomain() {
|
||||
boolean ok = MessageDialog
|
||||
.openConfirm(getShell(), "Confirm Exit",
|
||||
.openConfirm(
|
||||
getShell(),
|
||||
"Confirm Exit",
|
||||
"This will reset all variables to values so that the LAPS domain will fully includes the CWA area.");
|
||||
if (ok) {
|
||||
try {
|
||||
LapsToolsIO.defaultDomain(data);
|
||||
} catch (Exception e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
e.getLocalizedMessage(), e);
|
||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
||||
e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
populateSpinners();
|
||||
|
@ -967,23 +963,28 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
try {
|
||||
LapsToolsIO.readXmlFile(data);
|
||||
} catch (Exception e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
e.getLocalizedMessage(), e);
|
||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
||||
e);
|
||||
}
|
||||
populateSpinners();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyAction() {
|
||||
if(data.getLimits()) {
|
||||
System.out.print("LAPS Tools Dlg: problem with domain not covering CWA");
|
||||
if (data.getLimits()) {
|
||||
System.out
|
||||
.print("LAPS Tools Dlg: problem with domain not covering CWA");
|
||||
boolean yes = MessageDialog
|
||||
.openQuestion(getShell(), "Domain Size Error",
|
||||
"The size of the LAPS domain does not cover the entire CWA." +
|
||||
"\nWould you like to move and recenter domain?" +
|
||||
"\n\n(Answering 'No' will allow you to reedit text values, instead.)");
|
||||
if(yes){ return; }
|
||||
}
|
||||
.openQuestion(
|
||||
getShell(),
|
||||
"Domain Size Error",
|
||||
"The size of the LAPS domain does not cover the entire CWA."
|
||||
+ "\nWould you like to move and recenter domain?"
|
||||
+ "\n\n(Answering 'No' will allow you to reedit text values, instead.)");
|
||||
if (yes) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
cenLatSpnr.setEnabled(true);
|
||||
cenLonSpnr.setEnabled(true);
|
||||
nxSpnr.setEnabled(true);
|
||||
|
@ -1011,7 +1012,7 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
}
|
||||
}
|
||||
|
||||
private void loadAction() {
|
||||
private void loadAction() {
|
||||
cenLatSpnr.setEnabled(false);
|
||||
cenLonSpnr.setEnabled(false);
|
||||
nxSpnr.setEnabled(false);
|
||||
|
@ -1023,7 +1024,7 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
defaultBtn.setEnabled(false);
|
||||
writeDomainBtn.setEnabled(false);
|
||||
readSpinners();
|
||||
|
||||
|
||||
GenericToolsResourceData<LapsToolLayer> rd = new GenericToolsResourceData<LapsToolLayer>(
|
||||
LapsToolLayer.DEFAULT_NAME, LapsToolLayer.class);
|
||||
|
||||
|
@ -1047,29 +1048,30 @@ public class LAPSToolsDlg extends CaveSWTDialog {
|
|||
desc.getResourceList().add(rsc);
|
||||
rsc.getCapability(EditableCapability.class).setEditable(true);
|
||||
} catch (VizException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
e.getLocalizedMessage(), e);
|
||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
||||
e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void writeXmlfileAction() {
|
||||
private void writeXmlfileAction() {
|
||||
if (MessageDialog.openQuestion(getShell(), "Confirmation",
|
||||
LapsToolsIO.getWriteXmlQuestion())) {
|
||||
try {
|
||||
LapsToolsIO.writeXmlFile(data);
|
||||
statusHandler.handle(Priority.INFO, //SIGNIFICANT
|
||||
"Write EDEX domain.xml file. This action will initiated a LAPS Localization process.");
|
||||
statusHandler
|
||||
.handle(Priority.INFO, // SIGNIFICANT
|
||||
"Write EDEX domain.xml file. This action will initiate a LAPS Localization process.");
|
||||
close();
|
||||
} catch (Exception e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
e.getLocalizedMessage(), e);
|
||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
||||
e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean isLapsInstalled() {
|
||||
return isLapsInstalled;
|
||||
}
|
||||
|
||||
return isLapsInstalled;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ Lakes_graphicColor = 'blue'
|
|||
# MAP BACKGROUNDS
|
||||
#MapBackgrounds_default = ['Counties','Marine_Zones_XXX','Interstates']
|
||||
MapBackgrounds_default = ['Zones_XXX','Marine_Zones_XXX','Interstates','States','Lakes']
|
||||
XXX_mask = "XXX_CWA"
|
||||
XXX_mask = "XXX"
|
||||
|
||||
DefaultSamples = ['XXXTornadoThreat']
|
||||
# Customize FONT SIZES here
|
||||
|
|
|
@ -1689,7 +1689,7 @@ Scripts = [
|
|||
"-d {productDB} ",
|
||||
|
||||
"Make and Send HTI:" +
|
||||
"xterm -e ssh px2f /awips2/GFESuite/hti/bin/make_hti.sh",
|
||||
"xterm -e ssh px2f /awips2/GFESuite/hti/bin/make_hti.sh {site}",
|
||||
|
||||
"Official Grids to LDAD: " +
|
||||
"ifpAG -h {host} -r {port} -o - -d {productDB} | gzip -9 > " +
|
||||
|
|
|
@ -213,7 +213,7 @@ class Procedure (SmartScript.SmartScript):
|
|||
elif threatWEName == "FloodingRainThreat":
|
||||
editArea = self.getEditArea("MFL")
|
||||
elif threatWEName == "TornadoThreat":
|
||||
editArea = self.getEditArea("MFL_CWA")
|
||||
editArea = self.getEditArea("MFL")
|
||||
else:
|
||||
editArea = self.getEditArea("Marinezones")
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -43,7 +43,7 @@ VariableList = [("DEFAULT: Typical. Should only be changed in coordination with
|
|||
"Higher (40% Exceedance; for well-behaved systems within 6 hours of the event)",
|
||||
"Highest (50% Exceedance; for well-behaved systems at time of the event)"]),
|
||||
("Grid Smoothing?", "Yes", "radio", ["Yes","No"]),
|
||||
("Make grids from PHISH\n or ICS?\n", "PHISH", "radio", ["PHISH", "ISC"]),
|
||||
("Make grids from PHISH\n or ISC?\n", "PHISH", "radio", ["PHISH", "ISC"]),
|
||||
]
|
||||
|
||||
class Procedure (SmartScript.SmartScript):
|
||||
|
@ -432,7 +432,7 @@ class Procedure (SmartScript.SmartScript):
|
|||
# List of elements
|
||||
# See if we should copy from ISC. If so, do the copy and exit
|
||||
smoothThreatGrid = varDict["Grid Smoothing?"]
|
||||
PHISHorISC = varDict["Make grids from PHISH\n or ICS?\n"]
|
||||
PHISHorISC = varDict["Make grids from PHISH\n or ISC?\n"]
|
||||
#PHISHorISC = "PHISH"
|
||||
topodb = "NED"
|
||||
#topodb = varDict["Topographic Database?"]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Version 2014.12.17-0
|
||||
# Version 2015.2.10-1
|
||||
|
||||
import GenericHazards
|
||||
import JsonSupport
|
||||
|
@ -19,7 +19,6 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
def __init__(self):
|
||||
GenericHazards.TextProduct.__init__(self)
|
||||
self._pp = pprint.PrettyPrinter()
|
||||
|
||||
|
||||
###############################################################
|
||||
### Hazards and Additional Hazards
|
||||
|
@ -106,9 +105,9 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
error = self._getVariables(argDict)
|
||||
if error is not None:
|
||||
return error
|
||||
|
||||
self._backupFullStationID = self._fullStationID
|
||||
|
||||
self._argDict = argDict
|
||||
self._productID = self._pil[0:3].upper()
|
||||
|
||||
argDict["definition"] = self._definition
|
||||
|
||||
|
@ -123,6 +122,7 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
# 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)
|
||||
|
||||
|
@ -168,7 +168,7 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
def _wmoHeader(self, productDict, productSegmentGroup, arguments=None):
|
||||
headerDict = collections.OrderedDict()
|
||||
headerDict['TTAAii'] = self._wmoID
|
||||
headerDict['originatingOffice'] = self._backupFullStationID # Will be siteID if not in backup mode
|
||||
headerDict['originatingOffice'] = self._fullStationID
|
||||
headerDict['productID'] = self._productID
|
||||
headerDict['siteID'] = self._site
|
||||
headerDict['fullStationID'] = self._fullStationID
|
||||
|
@ -180,6 +180,7 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
headerDict['disclaimer'] = 'This XML wrapped text product should be considered COMPLETELY EXPERIMENTAL. The National Weather Service currently makes NO GUARANTEE WHATSOEVER that this product will continue to be supplied without interruption. The format of this product MAY CHANGE AT ANY TIME without notice.'
|
||||
headerDict['cityState'] = self._wfoCityState
|
||||
headerDict['stormNumber'] = self._getStormNumberStringFromTCP()
|
||||
# Modify the product name to indicate test or experimental mode if necessary
|
||||
self._productName = self.checkTestMode(
|
||||
self._argDict, productSegmentGroup.get('productName') + self._areaName)
|
||||
headerDict['productName'] = self._productName
|
||||
|
@ -194,13 +195,14 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
################# 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
|
||||
# The UGC header is the formatted list of UGCs along with an expire time
|
||||
# For example: 'FLZ066>068-071-072-063-069-073>075-168-172>174-070-230515-'
|
||||
ugcHeader = self._tpc.formatUGCs(self._ugcs, self._expireTime)
|
||||
productDict['ugcHeader'] = ugcHeader
|
||||
|
||||
################# Product Parts Processing
|
||||
|
||||
def _processProductParts(self, productGenerator, productDict, productSegmentGroup, productParts):
|
||||
def _processProductParts(self, productGenerator, productDict, productSegmentGroup, productParts):
|
||||
'''
|
||||
@param productDict
|
||||
@param productSegmentGroup
|
||||
|
@ -249,46 +251,18 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
"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):
|
||||
def _createProductDictionary(self, productPartsGenerator, segments, areProductPartsSegmented):
|
||||
# Create the product dictionary
|
||||
productSegmentGroup = self._groupSegments(segmentList)
|
||||
productSegmentGroup = self._groupSegments(productPartsGenerator,
|
||||
segments,
|
||||
areProductPartsSegmented)
|
||||
|
||||
productDict = self._initializeProductDictionary(productSegmentGroup)
|
||||
productParts = productSegmentGroup.get('productParts')
|
||||
productParts = productSegmentGroup.get('productParts')
|
||||
productDict['productParts'] = productParts
|
||||
self._processProductParts(self, productDict, productSegmentGroup, productParts)
|
||||
|
||||
|
@ -323,13 +297,9 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
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()
|
||||
|
@ -346,14 +316,26 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
### Sampling and Statistics related methods
|
||||
|
||||
def _getStatValue(self, statDict, element, method=None, dataType=None):
|
||||
|
||||
self.debug_print("*"*90, 1)
|
||||
self.debug_print("In _getStatValue looking for '%s'" % (element), 1)
|
||||
self.debug_print("statDict =\n%s" % (pprint.pformat(statDict)), 1)
|
||||
|
||||
stats = statDict.get(element, None)
|
||||
self.debug_print("stats =\n%s" % (pprint.pformat(stats)), 1)
|
||||
|
||||
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)
|
||||
|
||||
# Define a class to handle missing statistics
|
||||
class StatisticsException(Exception):
|
||||
pass
|
||||
|
||||
###############################################################
|
||||
### Area, Zone and Segment related methods
|
||||
|
@ -361,18 +343,47 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
def _allAreas(self):
|
||||
return self._inlandAreas() + self._coastalAreas()
|
||||
|
||||
def _groupSegments(self, productPartsGenerator, segments, areProductPartsSegmented):
|
||||
'''
|
||||
Group the segments into the products. The TCV and HLS product generators
|
||||
only create a single product each so there is only one product segment group.
|
||||
'''
|
||||
|
||||
segment_vtecRecords_tuples = self._getSegmentVTECRecordsTuples(segments)
|
||||
|
||||
productSegmentGroup = {
|
||||
'productID' : self._productID,
|
||||
'productName': self._productName,
|
||||
'geoType': 'area',
|
||||
'vtecEngine': self._hazardsTable,
|
||||
'mapType': 'publicZones',
|
||||
'segmented': areProductPartsSegmented,
|
||||
'productParts': productPartsGenerator(segment_vtecRecords_tuples),
|
||||
}
|
||||
|
||||
return productSegmentGroup
|
||||
|
||||
def _getSegmentVTECRecordsTuples(self, segments):
|
||||
segment_vtecRecords_tuples = []
|
||||
for segment in segments:
|
||||
vtecRecords = self._getVtecRecords(segment)
|
||||
self.debug_print("vtecRecords for %s =\n\n%s\n" % (segment, self._pp.pformat(vtecRecords)))
|
||||
segment_vtecRecords_tuples.append((segment, vtecRecords))
|
||||
|
||||
return segment_vtecRecords_tuples
|
||||
|
||||
def _computeIntersectAreas(self, editAreas, argDict):
|
||||
editAreaUtils = EditAreaUtils.EditAreaUtils()
|
||||
editAreaUtils.setUp(None, argDict)
|
||||
surgeEditArea = editAreaUtils.getEditArea("StormSurgeWW_EditArea", argDict)
|
||||
intersectAreas =[]
|
||||
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])
|
||||
if grid.isAnyBitsSet(): # Make sure the intersection isn't empty
|
||||
editAreaUtils.saveEditAreas([intersectArea]) # Register the new edit area with the system
|
||||
intersectAreas.append((intersectAreaLabel, intersectAreaLabel))
|
||||
|
||||
return intersectAreas
|
||||
|
@ -382,8 +393,7 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
|
||||
def _initializeHazardsTable(self, argDict):
|
||||
import VTECMessageType
|
||||
productID = self._pil[0:3]
|
||||
vtecMode = VTECMessageType.getVTECMessageType(productID.upper())
|
||||
vtecMode = VTECMessageType.getVTECMessageType(self._productID)
|
||||
argDict["vtecMode"] = vtecMode
|
||||
|
||||
self._setVTECActiveTable(argDict)
|
||||
|
@ -394,10 +404,8 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
self._hazardsTable = self._getHazardsTable(argDict, self.filterMethod)
|
||||
argDict["hazards"] = self._hazardsTable
|
||||
|
||||
def _getHazardsTable(self, argDict, filterMethod, editAreas=None):
|
||||
def _getHazardsTable(self, argDict, filterMethod):
|
||||
# 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:
|
||||
|
@ -408,21 +416,19 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
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
|
||||
productCategory = self._productID
|
||||
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'])
|
||||
cityEditAreas=[], dataMgr=argDict['dataMgr'])
|
||||
return hazards
|
||||
|
||||
def _ignoreActions(self):
|
||||
|
@ -443,11 +449,20 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
else:
|
||||
argDict["vtecActiveTable"] = "active"
|
||||
|
||||
def _getVtecRecords(self, segment, vtecEngine=None):
|
||||
def _getVtecRecords(self, segment):
|
||||
vtecRecords = self._hazardsTable.getHazardList(segment)
|
||||
# Tropical hazards shouldn't ever have EXT and EXB actions since
|
||||
# they are "until further notice"
|
||||
for record in vtecRecords:
|
||||
if record['act'] == "EXT":
|
||||
record['act'] = "CON"
|
||||
elif record['act'] == "EXB":
|
||||
record['act'] = "EXA"
|
||||
|
||||
return vtecRecords
|
||||
|
||||
def _getAllowedHazardList(self, allowedHazardList=None):
|
||||
# Get the list of allowed phenSigs (ie. "HU.W")
|
||||
if allowedHazardList is None:
|
||||
allowedHazardList = self.allowedHazards()
|
||||
hazardList = []
|
||||
|
@ -588,8 +603,8 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
|
||||
self._ddhhmmTime = self.getCurrentTime(
|
||||
argDict, "%d%H%M", shiftToLocal=0, stripLeading=0)
|
||||
self._currentTime = self._issueTime_secs
|
||||
self._expireTime = self._issueTime_secs + self._purgeTime*3600
|
||||
self._purgeHours = self._purgeTime
|
||||
self._expireTime = self._issueTime_secs + self._purgeHours*3600
|
||||
self._timeLabel = self.getCurrentTime(
|
||||
argDict, "%l%M %p %Z %a %b %e %Y", stripLeading=1)
|
||||
|
||||
|
@ -600,14 +615,13 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
startTime = self._calculateStartTime(time.gmtime(self._issueTime_secs))
|
||||
self._timeRange = self.makeTimeRange(startTime, startTime+120*3600)
|
||||
|
||||
# Create a time range to look from the current time back 12 hours
|
||||
# We will use this are to determine if we need to use "additional"
|
||||
# wording with rainfall
|
||||
# Create a time range to look from the current time back 12 hours.
|
||||
# We will use this to determine if we need to use "additional"
|
||||
# wording with rainfall for the TCV
|
||||
self._extraSampleTimeRange = self.makeTimeRange(startTime-12*3600,
|
||||
startTime)
|
||||
|
||||
# Determine the time range list, making sure they are on hour boundaries
|
||||
# w.r.t. midnight today according to the resolution
|
||||
# Determine the time range list according to the resolution
|
||||
subRanges = self.divideRange(self._timeRange, self._resolution())
|
||||
trList = []
|
||||
self._periodList = []
|
||||
|
@ -617,6 +631,7 @@ class TextProduct(GenericHazards.TextProduct):
|
|||
trList.append((tr, "Label"))
|
||||
|
||||
if index == 0:
|
||||
# Create the 10 periods
|
||||
startTime = tr.startTime()
|
||||
localtime = time.localtime(startTime.unixTime())
|
||||
|
||||
|
@ -1027,8 +1042,9 @@ FORECASTER STEWART"""
|
|||
self._loadLastTwoAdvisories()
|
||||
|
||||
def _synchronizeAdvisories(self):
|
||||
|
||||
# Retrieving a directory causes synching to occur
|
||||
# Retrieving a directory causes synching to occur.
|
||||
# This code can throw an exception but don't catch it
|
||||
# so that forecasters can be made aware of the issue.
|
||||
file = LocalizationSupport.getLocalizationFile(LocalizationSupport.CAVE_STATIC,
|
||||
LocalizationSupport.SITE, self._site,
|
||||
self._getAdvisoryPath()).getFile()
|
||||
|
@ -1091,7 +1107,7 @@ FORECASTER STEWART"""
|
|||
self._previousPreviousAdvisory = None
|
||||
if len(lastTwoAdvisories) >= 2:
|
||||
self._previousPreviousAdvisory = self._loadAdvisory(lastTwoAdvisories[1])
|
||||
|
||||
|
||||
def _loadAdvisory(self, advisoryName):
|
||||
self._synchronizeAdvisories()
|
||||
fileName = self._getAdvisoryFilename(advisoryName)
|
||||
|
@ -1370,10 +1386,10 @@ class TextProductCommon(DiscretePhrases.DiscretePhrases):
|
|||
if laterActive is not None:
|
||||
expireTime = min(expireTime, laterActive)
|
||||
elif canExpFound and not activeFound:
|
||||
expireTime = min(expireTime, issueTime+3600) #1hr from now
|
||||
expireTime = min(expireTime, issueTime+3600*1000) #1hr from now
|
||||
|
||||
#ensure expireTime is not before issueTime, and is at least 1 hour
|
||||
if expireTime - issueTime < 3600:
|
||||
if expireTime - issueTime < 3600*1000:
|
||||
expireTime = issueTime + 3600*1000
|
||||
|
||||
#round to next 'roundMinutes'
|
||||
|
@ -1449,7 +1465,9 @@ class TextProductCommon(DiscretePhrases.DiscretePhrases):
|
|||
def formatUGCs(self, ugcs, expireTime):
|
||||
'''
|
||||
Create ugc header with expire time
|
||||
'COC123-112330-'
|
||||
Examples:
|
||||
'COC123-112330-'
|
||||
'FLZ066>068-071-072-063-069-073>075-168-172>174-070-230515-'
|
||||
'''
|
||||
ugcStr = self.makeUGCString(ugcs)
|
||||
ddhhmmTime = self.getFormattedTime(
|
||||
|
@ -1546,6 +1564,10 @@ class TextProductCommon(DiscretePhrases.DiscretePhrases):
|
|||
def makeUGCString(self, ugcs):
|
||||
'''
|
||||
Create the UGC string for product / segment headers.
|
||||
|
||||
Examples:
|
||||
FLZ173-
|
||||
FLZ066>068-071-072-063-069-073>075-168-172>174-070-
|
||||
'''
|
||||
# if nothing in the list, return empty string
|
||||
if len(ugcs) == 0:
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
# __warnETNduplication() and
|
||||
# __highestETNActiveTable.
|
||||
# 11/11/14 4953 randerso Changed type of endTime from float to int
|
||||
# 02/05/15 4099 randerso Fixed exception handling in __getActiveTable
|
||||
#
|
||||
|
||||
|
||||
|
@ -933,7 +934,7 @@ class HazardsTable(VTECTableUtil.VTECTableUtil):
|
|||
|
||||
except:
|
||||
self.log.exception("Unable to access VTEC Active Table: ")
|
||||
raise Exception, s
|
||||
raise
|
||||
|
||||
def __createCityHazards(self):
|
||||
if not self.__accurateCities:
|
||||
|
|
|
@ -675,10 +675,11 @@ class TextUtils:
|
|||
def getPreviousProduct(self, productID, searchString="", version=0):
|
||||
# gets a previous product from the AWIPS database
|
||||
|
||||
from com.raytheon.viz.gfe.core import DataManagerUIFactory
|
||||
from com.raytheon.viz.gfe.product import TextDBUtil
|
||||
|
||||
# DR 15703 - always retrieve operational products
|
||||
opMode = True
|
||||
# Redmine #17120 - return to pre-DR 15703 behavior.
|
||||
opMode = DataManagerUIFactory.getCurrentInstance().getOpMode().name() == "OPERATIONAL"
|
||||
previousProduct = TextDBUtil.retrieveProduct(productID, version, opMode)
|
||||
previousProduct = string.strip(previousProduct)
|
||||
|
||||
|
|
|
@ -0,0 +1,225 @@
|
|||
# ----------------------------------------------------------------------------
|
||||
# This software is in the public domain, furnished "as is", without technical
|
||||
# support, and with no warranty, express or implied, as to its usefulness for
|
||||
# any purpose.
|
||||
#
|
||||
# DefineMaxWindGUI
|
||||
#
|
||||
# Author:
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
try: # See if this is the AWIPS I environment
|
||||
from Numeric import *
|
||||
import AFPS
|
||||
AWIPS_ENVIRON = "AWIPS1"
|
||||
except: # Must be the AWIPS II environment
|
||||
from numpy import *
|
||||
import AbsTime
|
||||
import TimeRange
|
||||
AWIPS_ENVIRON = "AWIPS2"
|
||||
|
||||
import SmartScript
|
||||
import Tkinter
|
||||
import tkFont
|
||||
|
||||
|
||||
class DefineMaxWindGUI(SmartScript.SmartScript):
|
||||
|
||||
def __init__(self, dbss, eaMgr=None):
|
||||
SmartScript.SmartScript.__init__(self, dbss)
|
||||
|
||||
if AWIPS_ENVIRON == "AWIPS1":
|
||||
self.setUp(eaMgr)
|
||||
|
||||
def reportQuadError(self):
|
||||
self.statusBarMsg("Only three quadants at a time may be reduced.\n" + \
|
||||
"...Please toggle another quadrant off first.","S")
|
||||
return
|
||||
|
||||
def toggleButton(self, buttonLabel):
|
||||
b = self._buttonLabels.index(buttonLabel)
|
||||
if self._buttonState[b]: # button was on
|
||||
self._buttonState[b] = False
|
||||
self._buttonList[b].configure(background="gray", activebackground="gray")
|
||||
else: # button was off
|
||||
if sum(self._buttonState) > 2: # only three at a time allowed
|
||||
self.reportQuadError()
|
||||
return
|
||||
self._buttonState[b] = True
|
||||
self._buttonList[b].configure(background="green", activebackground="green")
|
||||
|
||||
|
||||
def NEClick(self):
|
||||
self.toggleButton("NE")
|
||||
return
|
||||
|
||||
def SEClick(self):
|
||||
self.toggleButton("SE")
|
||||
return
|
||||
|
||||
def SWClick(self):
|
||||
self.toggleButton("SW")
|
||||
return
|
||||
|
||||
def NWClick(self):
|
||||
self.toggleButton("NW")
|
||||
return
|
||||
|
||||
def makeLabel(self, frame):
|
||||
|
||||
label = Tkinter.Label(frame, fg="red", font=self._boldFont,
|
||||
text="Max winds will be reduced by\n 20% in selected quadrants")
|
||||
label.grid(row=0)
|
||||
|
||||
return
|
||||
|
||||
def makeBottomButtons(self, frame):
|
||||
# Create the Execute/Cancel buttons
|
||||
self._doneButton = Tkinter.Button(frame, text="Done",
|
||||
command=self.doneCommand)
|
||||
self._doneButton.grid(row=3, column=0, padx=20, pady=5, sticky=Tkinter.W)
|
||||
|
||||
self._cancelButton = Tkinter.Button(frame, text="Cancel",
|
||||
command=self.cancelCommand)
|
||||
self._cancelButton.grid(row=3, column=2, padx=20, pady=5, sticky=Tkinter.E)
|
||||
|
||||
frame.grid(columnspan=3, sticky=Tkinter.EW)
|
||||
|
||||
return
|
||||
|
||||
def makeQuadButtons(self, frame):
|
||||
# Create the quadrant buttons
|
||||
commandList = [self.NWClick, self.SWClick, self.SEClick, self.NEClick]
|
||||
self._buttonLabels = ["NW", "SW", "SE", "NE"]
|
||||
|
||||
# define the button position in geometric order
|
||||
buttonPos = [(0, 0), (1, 0), (1, 1), (0, 1)]
|
||||
for b in range(len(self._buttonLabels)):
|
||||
label = self._buttonLabels[b]
|
||||
|
||||
self._buttonList[b] = Tkinter.Button(frame, text=label,
|
||||
command=commandList[b],
|
||||
font=self._bigFont, width=3)
|
||||
rowPos, colPos = buttonPos[b]
|
||||
self._buttonList[b].grid(row=rowPos, column=colPos, padx=30, pady=10)
|
||||
|
||||
return
|
||||
|
||||
def setUpUI(self):
|
||||
|
||||
self._labelFrame = Tkinter.Frame(self._master)
|
||||
|
||||
self._labelFrame.grid(row=0)
|
||||
|
||||
|
||||
self._buttonFrame = Tkinter.Frame(self._master, borderwidth=3,
|
||||
relief=Tkinter.RIDGE, bd=2, pady=5)
|
||||
self._buttonFrame.grid(row=1, column=0,padx=25,
|
||||
sticky=Tkinter.E+Tkinter.W, pady=5)
|
||||
|
||||
|
||||
self._bottomFrame = Tkinter.Frame(self._master, borderwidth=3,
|
||||
relief=Tkinter.RIDGE, bd=2)
|
||||
self._bottomFrame.grid(row=2, column=0, columnspan=2, padx=25)
|
||||
|
||||
self._master.title("Reduce Max Wind by Quadrant")
|
||||
|
||||
self.makeLabel(self._labelFrame)
|
||||
|
||||
self.makeQuadButtons(self._buttonFrame)
|
||||
|
||||
self.makeBottomButtons(self._bottomFrame)
|
||||
|
||||
return
|
||||
|
||||
def doneCommand(self):
|
||||
self._master.quit()
|
||||
|
||||
quadCount = 4
|
||||
reducePct = 0.80
|
||||
|
||||
# Gather up the maxWind info to return to the main tool
|
||||
self._maxWindDict = {}
|
||||
for h in range(len(self._hourList)):
|
||||
windList = []
|
||||
for quad in range(quadCount):
|
||||
|
||||
# Reduce the value if that quadrant was selected
|
||||
if self._buttonState[quad]:
|
||||
windValue = self._maxWind[quad][h] * self._allTimeMaxWind * reducePct
|
||||
else:
|
||||
windValue = self._maxWind[quad][h] * self._allTimeMaxWind
|
||||
|
||||
windList.append(windValue)
|
||||
|
||||
windList.reverse()
|
||||
self._maxWindDict[self._hourList[h]] = windList
|
||||
|
||||
return
|
||||
|
||||
def cancelCommand(self):
|
||||
self._master.destroy()
|
||||
|
||||
return None
|
||||
|
||||
def displayGUI(self, windDict):
|
||||
|
||||
self._windDict = windDict
|
||||
self._maxWindDict = None
|
||||
self._quadCount = 4
|
||||
|
||||
hourKeys = self._windDict.keys()
|
||||
hourKeys.sort()
|
||||
self._hourList = hourKeys
|
||||
self._initialMinWind = []
|
||||
self._initialMaxWind = []
|
||||
for hour in hourKeys:
|
||||
minWind, maxWind = windDict[hour]
|
||||
self._initialMinWind.append(minWind)
|
||||
self._initialMaxWind.append(maxWind)
|
||||
|
||||
self._hourCount = len(hourKeys)
|
||||
|
||||
if AWIPS_ENVIRON == "AWIPS1":
|
||||
self._allTimeMaxWind = max(self._initialMaxWind)
|
||||
else: # numpy uses "amax"
|
||||
self._allTimeMaxWind = amax(self._initialMaxWind)
|
||||
|
||||
|
||||
|
||||
# Make the topLevel window - different for A1 and A2
|
||||
if AWIPS_ENVIRON == 'AWIPS1':
|
||||
self._master = Tkinter.Toplevel(self.eaMgr().root())
|
||||
self._master.transient(self.eaMgr().root()) # always draw on top of GFE
|
||||
else:
|
||||
self._tkmaster = Tkinter.Tk()
|
||||
self._master = Tkinter.Toplevel(self._tkmaster)
|
||||
self._tkmaster.withdraw()
|
||||
|
||||
self._buttonLabels = ["NW", "SW", "SE", "NE"]
|
||||
|
||||
self._buttonState = [False, False, False, False]
|
||||
self._buttonList = [None, None, None, None]
|
||||
|
||||
self._boldFont = tkFont.Font(family="Helvetica", size=12, weight="bold")
|
||||
self._bigFont = tkFont.Font(family="Helvetica", size=16)
|
||||
|
||||
self.setUpUI()
|
||||
|
||||
self._maxWind = zeros((self._quadCount, self._hourCount)) * 1.0
|
||||
|
||||
for hour in range(len(hourKeys)):
|
||||
for quad in range(self._quadCount):
|
||||
minWind, maxWind = self._windDict[hourKeys[hour]]
|
||||
self._maxWind[quad][hour] = maxWind / self._allTimeMaxWind
|
||||
|
||||
|
||||
#self.updateDisplay() # Draws everything
|
||||
|
||||
|
||||
self._master.mainloop()
|
||||
|
||||
self._master.withdraw()
|
||||
self._master.destroy()
|
||||
|
||||
return self._maxWindDict
|
|
@ -5,6 +5,7 @@
|
|||
# TCV_Dictionary
|
||||
# TCV_Dictionary file
|
||||
# Author: GFE Installation Script
|
||||
# Last Modified: Feb 13, 2015
|
||||
# ----------------------------------------------------------------------------
|
||||
# Needed to prevent an error from the SmartTool module
|
||||
WeatherElementEdited = None
|
||||
|
@ -13,83 +14,83 @@ ThreatStatements = {
|
|||
"Wind": {
|
||||
"Extreme": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3, 4, or 5 intensity.",
|
||||
"planning": "Emergency planning should include a reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3 intensity or higher.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic wind impacts. Efforts should now be underway to secure all properties.",
|
||||
"action": "Life threatening wind is possible. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering.",
|
||||
"action": "Extremely Dangerous and life threatening wind is possible. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3, 4, or 5 intensity.",
|
||||
"planning": "Emergency plans should include a reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3 intensity or higher.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic wind impacts. Remaining efforts to secure properties should now be brought to completion.",
|
||||
"action": "Life threatening wind is possible. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering. Move to safe shelter before the wind becomes hazardous.",
|
||||
"action": "Extremely dangerous and life threatening wind is possible. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering. Move to safe shelter before the wind becomes hazardous.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Brace against the reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3, 4, or 5 intensity. Maintain readiness for emergency response.",
|
||||
"preparation": "To be safe, last minute efforts should fully focus on protecting life. Efforts to secure properties against devastating to catastrophic wind impacts should now be complete.",
|
||||
"action": "Life threatening wind is imminent or ongoing. Now is the time to urgently hide from the wind. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering. Remain sheltered until the hazardous wind subsides. Be ready to quickly move to the safest place within your shelter if extreme wind warnings are issued.",
|
||||
"planning": "Remain braced against the reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3 intensity or higher.",
|
||||
"preparation": "To be safe, efforts should fully focus on protecting life. Properties remain subject to devastating to catastrophic wind impacts.",
|
||||
"action": "Now is the time to urgently hide from the wind. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering. Remain sheltered until the hazardous wind subsides. Be ready to quickly move to the safest place within your shelter if extreme wind warnings are issued.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat of hazardous wind has subsided.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries or loss of life.",
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injury or loss of life. If you have a life-threatening emergency dial 9 1 1.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for major hurricane force wind greater than 110 MPH of equivalent Category 3 or higher.",
|
||||
"preparation": "Be safe and aggressively protect against the potential of devastating to catastrophic wind impacts.",
|
||||
"action": "Extremely dangerous and life threatening wind is possible. Failure to adequately shelter may result in serious injury, loss of life, or immense human suffering.",
|
||||
},
|
||||
},
|
||||
"High": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 or 2 intensity.",
|
||||
"planning": "Emergency planning should include a reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 to 2 intensity.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive wind impacts. Efforts should now be underway to secure all properties.",
|
||||
"action": "Life threatening wind is possible. Failure to adequately shelter may result in serious injury or loss of life.",
|
||||
"action": "Dangerous and life threatening wind is possible. Failure to adequately shelter may result in serious injury or loss of life.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 or 2 intensity.",
|
||||
"planning": "Emergency plans should include a reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 to 2 intensity.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive wind impacts. Remaining efforts to secure properties should now be brought to completion.",
|
||||
"action": "Life threatening wind is possible. Failure to adequately shelter may result in serious injury or loss of life. Move to safe shelter before the wind becomes hazardous.",
|
||||
"action": "Dangerous and life threatening wind is possible. Failure to adequately shelter may result in serious injury or loss of life. Move to safe shelter before the wind becomes hazardous.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Brace against the reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 or 2 intensity.",
|
||||
"preparation": "To be safe, last minute efforts should fully focus on protecting life. Efforts to secure properties against extensive wind impacts should now be complete.",
|
||||
"action": "Life threatening wind is imminent or ongoing. Now is the time to urgently hide from the wind. Failure to adequately shelter may result in serious injury or loss of life. Remain sheltered until the hazardous wind subsides.",
|
||||
"planning": "Remain braced against the reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 to 2 intensity.",
|
||||
"preparation": "To be safe, efforts should fully focus on protecting life. Properties remain subject to extensive wind impacts.",
|
||||
"action": "Now is the time to urgently hide from the wind. Failure to adequately shelter may result in serious injury or loss of life. Remain sheltered until the hazardous wind subsides.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries or loss of life.",
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injury or loss of life. If you have a life-threatening emergency dial 9 1 1." ,
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for hurricane force wind of 74 to 110 MPH of equivalent Category 1 to 2 intensity.",
|
||||
"preparation": "Be safe and aggressively protect against for the potential of extensive wind impacts.",
|
||||
"action": "Dangerous and life threatening wind is possible. Failure to adequately shelter may result in serious injury or loss of life.",
|
||||
},
|
||||
},
|
||||
"Mod": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for strong tropical storm force wind of 58 to 73 MPH.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant wind impacts. Efforts should now be underway to secure all properties.",
|
||||
"action": "Failure to adequately shelter may result in serious injury, or in some cases loss of life.",
|
||||
"action": "Dangerous wind is possible. Failure to adequately shelter may result in serious injury, or in some cases loss of life.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for strong tropical storm force wind of 58 to 73 MPH.",
|
||||
"planning": "Emergency plans should include a reasonable threat for strong tropical storm force wind of 58 to 73 MPH.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant wind impacts. Remaining efforts to secure properties should now be brought to completion.",
|
||||
"action": "Dangerous wind is possible. Failure to adequately shelter may result in serious injury, or in some cases loss of life. Move to safe shelter before the wind becomes hazardous.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Brace against the reasonable threat for strong tropical storm force wind of 58 to 73 MPH.",
|
||||
"preparation": "To be safe, last minute efforts should fully focus on protecting life. Efforts to secure properties against significant wind impacts should now be complete.",
|
||||
"action": "Dangerous wind is imminent or ongoing. Now is the time to hide from the wind. Failure to adequately shelter may result in serious injury, or in some cases loss of life. Remain sheltered until the hazardous wind subsides.",
|
||||
"planning": "Remain braced against the reasonable threat for strong tropical storm force wind of 58 to 73 MPH.",
|
||||
"preparation": "To be safe, efforts should fully focus on protecting life. Properties remain subject to significant wind impacts.",
|
||||
"action": "Now is the time to hide from the wind. Failure to adequately shelter may result in serious injury, or in some cases loss of life. Remain sheltered until the hazardous wind subsides.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries, or in some cases loss of life.",
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injury, or in some cases loss of life. If you have a life-threatening emergency dial 9 1 1.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for strong tropical storm force wind of 58 to 73 MPH.",
|
||||
"preparation": "Be safe and earnestly protect against the potential of significant wind impacts.",
|
||||
"action": "Dangerous wind is possible. Failure to adequately shelter may result in serious injury, or in some cases loss of life.",
|
||||
},
|
||||
},
|
||||
"Elevated": {
|
||||
|
@ -99,49 +100,49 @@ ThreatStatements = {
|
|||
"action": "Hazardous wind is possible. Failure to adequately shelter may result in serious injury.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for tropical storm force wind of 39 to 57 MPH.",
|
||||
"planning": "Emergency plans should include a reasonable threat for tropical storm force wind of 39 to 57 MPH.",
|
||||
"preparation": "To be safe, prepare for the potential of limited wind impacts. Remaining efforts to secure properties should now be brought to completion.",
|
||||
"action": "Hazardous wind is possible. Failure to adequately shelter may result in serious injury. Move to safe shelter before the wind becomes hazardous.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Brace against the reasonable threat for tropical storm force wind of 39 to 57 MPH. Maintain a readiness for emergency response.",
|
||||
"preparation": "To be safe, last minute efforts should fully focus on avoiding injury. Efforts to secure properties against limited wind impacts should now be complete.",
|
||||
"action": "Hazardous wind is imminent or ongoing. Now is the time to hide from the wind. Failure to adequately shelter may result in serious injury. Remain sheltered until the hazardous wind subsides.",
|
||||
"planning": "Remain braced against the reasonable threat for tropical storm force wind of 39 to 57 MPH.",
|
||||
"preparation": "To be safe, efforts should fully focus on avoiding injury. Properties remain subject to limited wind impacts.",
|
||||
"action": "Now is the time to hide from the wind. Failure to adequately shelter may result in serious injury. Remain sheltered until the hazardous wind subsides.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries.",
|
||||
"planning": "The threat for hazardous wind has subsided.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Stay out of restricted areas.",
|
||||
"action": "Failure to exercise due safety may result in additional injury. If you have a life-threatening emergency dial 9 1 1.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for tropical storm force wind of 39 to 57 MPH.",
|
||||
"preparation": "Be safe and protect against the potential of limited wind impacts.",
|
||||
"action": "Hazardous wind is possible. Failure to adequately shelter may result in serious injury.",
|
||||
},
|
||||
},
|
||||
"None": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning for this event need not include a threat for tropical storm force wind. The wind will remain less than 39 MPH, but conditions may still be breezy to windy.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical wind.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical wind event.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical winds at this time.",
|
||||
"action": "Ensure readiness for the next tropical wind event.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning for this event need not include a threat for tropical storm force wind. The wind will remain less than 39 MPH, but conditions may still be breezy to windy.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical wind.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical wind event.",
|
||||
"planning": "Emergency plans for this event need not include a threat for tropical storm force wind. The wind will remain less than 39 MPH, but conditions may still be breezy to windy.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical winds at this time.",
|
||||
"action": "Ensure readiness for the next tropical wind event.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "The wind will remain less than 39 MPH, but conditions may still be breezy to windy.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical wind.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical wind event.",
|
||||
"planning": "Emergency considerations need not include a threat for tropical storm force wind. The wind will remain less than 39 MPH, but conditions may still be breezy to windy.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical winds at this time.",
|
||||
"action": "Ensure readiness for the next tropical wind event.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Conditions may be still breezy to windy.",
|
||||
"planning": "Conditions may still be breezy to windy.",
|
||||
"preparation": "Exercise due safety when moving about.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical wind event.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "Conditions may be breezy to windy.",
|
||||
"default": {
|
||||
"planning": "Conditions may still be breezy to windy.",
|
||||
"preparation": "Exercise due safety when moving about.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical wind event.",
|
||||
},
|
||||
|
@ -152,134 +153,134 @@ ThreatStatements = {
|
|||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for extreme storm surge flooding greater than 9 feet above ground.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic storm surge flooding impacts. Evacuation efforts should now be underway.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or immense human suffering. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or immense human suffering. Leave immediately if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for extreme storm surge flooding greater than 9 feet above ground.",
|
||||
"planning": "Emergency plans should include a reasonable threat for extreme storm surge flooding greater than 9 feet above ground.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic storm surge flooding impacts. Evacuation efforts should now be brought to completion. Evacuations must be complete before driving conditions become unsafe.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or immense human suffering. Leave immediately if evacuation orders have been given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or immense human suffering. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency response should posture for a reasonable threat for extreme storm surge flooding greater than 9 feet above ground.",
|
||||
"preparation": "To be safe, evacuees should now be located within prescribed shelters and well away from deadly storm surge flooding capable of devastating to catastrophic impacts.",
|
||||
"action": "Life threatening inundation is imminent or ongoing. Failure to have heeded evacuation orders may result in serious injury, significant loss of life, or immense human suffering.",
|
||||
"planning": "Emergency considerations should posture for a reasonable threat for extreme storm surge flooding greater than 9 feet above ground.",
|
||||
"preparation": "To be safe, evacuees should be located within prescribed shelters and well away from deadly storm surge flooding capable of devastating to catastrophic impacts.",
|
||||
"action": "Life threatening inundation is possible. Those who failed to heed evacuation orders risk serious injury, significant loss of life, or immense human suffering.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat of deadly storm surge is abating as flood waters recede.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Do not return to evacuated areas until flood waters completely recede and the all-clear is officially given.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries or loss of life.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Do not return to evacuated areas until flood waters completely recede and the all-clear is officially given.",
|
||||
"action": "Failure to exercise due safety may result in additional injury or loss of life. If you have a life-threatening emergency dial 9 1 1.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for extreme storm surge flooding greater than 9 feet above ground.",
|
||||
"preparation": "Be safe and aggressively guard against the potential of devastating to catastrophic storm surge flooding impacts.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed official instructions may result in serious injury, significant loss of life, or immense human suffering. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
},
|
||||
},
|
||||
"High": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for major storm surge flooding of 6 to 9 feet above ground.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive storm surge flooding impacts. Evacuate efforts should now be underway.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or human suffering. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive storm surge flooding impacts. Evacuation efforts should now be underway.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or human suffering. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for major storm surge flooding of 6 to 9 feet above ground.",
|
||||
"planning": "Emergency plans should include a reasonable threat for major storm surge flooding of 6 to 9 feet above ground.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive storm surge flooding impacts. Evacuation efforts should now be brought to completion. Evacuations must be complete before driving conditions become unsafe.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury, significant loss of life, or human suffering. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency response should posture for a reasonable threat for major storm surge flooding of 6 to 9 feet above ground.",
|
||||
"preparation": "To be safe, evacuees should now be located within prescribed shelters and well away from deadly storm surge flooding capable of extensive impacts.",
|
||||
"action": "Life threatening inundation is imminent or ongoing. Failure to have heeded evacuation orders may result in serious injury, significant loss of life, or human suffering.",
|
||||
"planning": "Emergency considerations should posture for a reasonable threat for major storm surge flooding of 6 to 9 feet above ground.",
|
||||
"preparation": "To be safe, evacuees should be located within prescribed shelters and well away from deadly storm surge flooding capable of extensive impacts.",
|
||||
"action": "Life threatening inundation is possible. Those who failed to heed evacuation orders risk serious injury, significant loss of life, or human suffering.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat of deadly storm surge is abating as flood waters recede.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Do not return to evacuated areas until flood waters completely recede and the all-clear is officially given.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries or loss of life.",
|
||||
"planning": "The threat of deadly storm surge is abating as flood waters recede.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Do not return to evacuated areas until flood waters completely recede and the all-clear is officially given.",
|
||||
"action": "Failure to exercise due safety may result in additional injury or loss of life. If you have a life-threatening emergency dial 9 1 1.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for major storm surge flooding of 6 to 9 feet above ground.",
|
||||
"preparation": "Be safe and aggressively guard against the potential of extensive storm surge flooding impacts.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed official instructions may result in serious injury, significant loss of life, or human suffering. Poor decisions may result in being cut off or needlessly risk lives.",
|
||||
},
|
||||
},
|
||||
"Mod": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for dangerous storm surge flooding of 3 to 6 feet above ground.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant storm surge flooding impacts. Evacuation efforts should now be underway.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders or instructions from local officials may result in serious injury or loss of life. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may needlessly risk lives.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury or loss of life. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may needlessly risk lives.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for dangerous storm surge flooding of 3 to 6 feet above ground.",
|
||||
"planning": "Emergency plans should include a reasonable threat for dangerous storm surge flooding of 3 to 6 feet above ground.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant storm surge flooding impacts. Evacuation efforts should now be brought to completion. Evacuations must be complete before driving conditions become unsafe.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders or instructions from local officials may result in serious injury or loss of life. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may needlessly risk lives.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed evacuation orders may result in serious injury or loss of life. Leave if evacuation orders are given for your area. Consider voluntary evacuation if recommended. Poor decisions may needlessly risk lives.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency response should posture for a reasonable threat for dangerous storm surge flooding of 3 to 6 feet above ground.",
|
||||
"preparation": "To be safe, evacuees should now be located within prescribed shelters and well away from storm surge flooding capable of significant impacts.",
|
||||
"action": "Life threatening inundation is imminent or ongoing. Failure to have heeded evacuation orders or instructions from local officials may result in serious injury or loss of life.",
|
||||
"planning": "Emergency considerations should posture for a reasonable threat for dangerous storm surge flooding of 3 to 6 feet above ground.",
|
||||
"preparation": "To be safe, evacuees should be located within prescribed shelters and well away from storm surge flooding capable of significant impacts.",
|
||||
"action": "Life threatening inundation is possible. Those who failed to heed evacuation orders risk serious injury or loss of life.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat of dangerous storm surge is abating as flood waters recede.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Do not return to evacuated areas until flood waters completely recede and the all-clear is officially given.",
|
||||
"action": "Failure to exercise due safety may result in additional injuries or loss of life.",
|
||||
"planning": "The threat of dangerous storm surge is abating as flood waters recede.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Do not return to evacuated areas until flood waters completely recede and the all-clear is officially given.",
|
||||
"action": "Failure to exercise due safety may result in additional injury or loss of life. If you have a life-threatening emergency dial 9 1 1.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for dangerous storm surge flooding of 3 to 6 feet above ground.",
|
||||
"preparation": "Be safe and earnestly guard against the potential of significant storm surge flooding impacts.",
|
||||
"action": "Life threatening inundation is possible. Failure to heed official instructions may result in serious injury or loss of life. Poor decisions may needlessly risk lives.",
|
||||
},
|
||||
},
|
||||
"Elevated": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"preparation": "To be safe, prepare for the potential of limited storm surge flooding impacts. Preparedness efforts should be underway.",
|
||||
"action": "Localized inundation is possible. Follow the instructions of local officials. Consider voluntary evacuation if recommended. Leave if evacuation orders are issued.",
|
||||
"planning": "Emergency planning should include a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"preparation": "To be safe, prepare for the potential of limited storm surge flooding impacts. Efforts should now be underway.",
|
||||
"action": "Localized inundation is possible. Follow the instructions of local officials. Consider voluntary evacuation if recommended. Leave if evacuation orders are issued.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Adjustments to emergency plans should include a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"preparation": "To be safe, prepare for the potential of limited storm surge flooding impacts. Preparedness efforts should now be brought to completion before conditions deteriorate.",
|
||||
"planning": "Emergency plans should include a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"preparation": "To be safe, prepare for the potential of limited storm surge flooding impacts. Efforts should now be brought to completion before conditions deteriorate.",
|
||||
"action": "Localized inundation is possible. Follow the instructions of local officials. Consider voluntary evacuation if recommended. Leave immediately if evacuation orders are issued.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency response should posture for a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"planning": "Emergency considerations should posture for a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"preparation": "To be safe, stay away from storm surge flooding capable of limited impacts.",
|
||||
"action": "Localized inundation is imminent or ongoing. Continue to follow the instructions of local officials.",
|
||||
"action": "Localized inundation is possible. Continue to follow the instructions of local officials.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "The threat of hazardous storm surge is abating as flood waters recede.",
|
||||
"preparation": "To be safe, heed the instructions of local officials when moving about. Do not return to flooded areas until the all-clear is officially given.",
|
||||
"action": "Exercise due safety.",
|
||||
"planning": "The threat of hazardous storm surge is abating as flood waters recede.",
|
||||
"preparation": "Be safe and heed the instructions of local officials when moving about. Do not enter flooded areas.",
|
||||
"action": "Exercise due safety.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for peak storm surge flooding of 1 to 3 feet above ground.",
|
||||
"preparation": "Be safe and guard against the potential of limited storm surge flooding impacts.",
|
||||
"action": "Localized inundation is possible. Follow the instructions of local officials.",
|
||||
},
|
||||
},
|
||||
"None": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning for this event need not include a threat for storm surge flooding. The ground will remain largely unflooded from surge water or only have spots minimally affected by surge encroachment. Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Little to no preparations needed to guard against storm surge flooding.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next storm surge event.",
|
||||
"planning": "Emergency planning for this event need not include a threat for storm surge flooding. The ground will remain largely unflooded from surge water or only have spots minimally affected by surge water encroachment. Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Little to no preparations needed to guard against storm surge flooding at this time.",
|
||||
"action": "Ensure readiness for the next storm surge event.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning for this event need not include a threat for storm surge flooding. The ground will remain largely unflooded from surge water or only have spots minimally affected by surge encroachment. Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Little to no preparations needed to guard against storm surge flooding.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next storm surge event.",
|
||||
"planning": "Emergency plans for this event need not include a threat for storm surge flooding. The ground will remain largely unflooded from surge water or only have spots minimally affected by surge water encroachment. Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Little to no preparations needed to guard against storm surge flooding at this time.",
|
||||
"action": "Ensure readiness for the next storm surge event.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "The ground will remain largely unflooded from surge water or only have spots minimally affected by surge encroachment. Surg conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Little to no preparations needed to guard against storm surge flooding.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next storm surge event.",
|
||||
"planning": "Emergency considerations for this event need not include a threat for storm surge flooding. The ground will remain largely unflooded from surge water or only have spots minimally affected by surge water encroachment. Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Little to no preparations needed to guard against storm surge flooding at this time.",
|
||||
"action": "Ensure readiness for the next storm surge event.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Surf conditions may be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"planning": "Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next storm surge event.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "Surf conditions may be rough with some beach erosion. Stronger than normal rip currents may also be present. ",
|
||||
"preparation": "Exercise due safety.",
|
||||
"default": {
|
||||
"planning": "Surf conditions may still be rough with some beach erosion. Stronger than normal rip currents may also be present.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next storm surge event.",
|
||||
},
|
||||
},
|
||||
|
@ -287,273 +288,270 @@ ThreatStatements = {
|
|||
"Flooding Rain": {
|
||||
"Extreme": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat of extreme flooding where peak rainfall totals vastly exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are very likely. ",
|
||||
"planning": "Emergency planning should include a reasonable threat of extreme flooding where peak rainfall totals vastly exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are very likely.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury, significant loss of life, or human suffering. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury, significant loss of life, or human suffering. If flood related watches and warnings are issued, heed recommended actions. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground before flood waters arrive.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for extreme flooding where peak rainfall totals vastly exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are very likely.",
|
||||
"planning": "Emergency plans should include a reasonable threat of extreme flooding where peak rainfall totals vastly exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are very likely.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury, significant loss of life, and human suffering. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury, significant loss of life, or human suffering. If flood related watches and warnings are issued, heed recommended actions. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground before flood waters arrive.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans should include a reasonable threat for extreme flooding where peak rainfall totals vastly exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are very likely.",
|
||||
"preparation": "To be safe, remain prepared for the potential of devastating to catastrophic flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury, significant loss of life, and human suffering. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. ",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency plans should include a reasonable threat for extreme flooding where peak rainfall totals vastly exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are very likely.",
|
||||
"preparation": "To be safe, remain prepared for the potential of devastating to catastrophic flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury, significant loss of life, and human suffering. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed and do not let down your guard.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Do not drive through existing flood waters that cover the road.",
|
||||
},
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.", },
|
||||
},
|
||||
"High": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for major flooding where peak rainfall totals well exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are likely.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury or significant loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury or significant loss of life. If flood related watches and warnings are issued, heed recommended actions. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground before flood waters arrive.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for major flooding where peak rainfall totals well exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are likely.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive flooding rain impacts. Life threatening flooding possible from excessive tropical rain.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury or significant loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground.",
|
||||
"planning": "Emergency plans should include a reasonable threat for major flooding where peak rainfall totals well exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are likely.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury or significant loss of life. If flood related watches and warnings are issued, heed recommended actions. Poor decisions may result in being cut off or needlessly risk lives. If vulnerable, relocate to safe shelter on higher ground before flood waters arrive.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans should include a reasonable threat for major flooding where peak rainfall totals well exceed amounts conducive for flash flooding and rapid inundation.",
|
||||
"preparation": "To be safe, remain prepared for the potential of extensive flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury or significant loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency plans should continue to include a reasonable threat for major flooding where peak rainfall totals well exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are likely.",
|
||||
"preparation": "To be safe, remain prepared for the potential of extensive flooding rain impacts.",
|
||||
"action": "Life threatening flooding is possible. Failure to take action may result in serious injury or significant loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed and do not let down your guard.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Do not drive through existing flood waters that cover the road.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
},
|
||||
},
|
||||
"Mod": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for moderate flooding where peak rainfall totals notably exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are possible.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant flooding rain impacts.",
|
||||
"action": "Dangerous flooding is possible. Failure to take action may result in serious injury or loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
"action": "Dangerous flooding is possible. Failure to take action may result in serious injury or loss of life. If flood related watches and warnings are issued, heed recommended actions.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for moderate flooding where peak rainfall totals notably exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are possible.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant flooding rain impacts.",
|
||||
"action": "Dangerous flooding is possible. Failure to take action may result in serious injury or loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans should include a reasonable threat for moderate flooding where peak rainfall totals notably exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are possible.",
|
||||
"preparation": "To be safe, remain prepared for the potential of significant flooding rain impacts.",
|
||||
"action": "Dangerous flooding is possible. Failure to take action may result in serious injury or loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant flooding rain impacts.",
|
||||
"action": "Dangerous flooding is possible. Failure to take action may result in serious injury or loss of life. If flood related watches and warnings are issued, heed recommended actions.", },
|
||||
"hunker down": {
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency plans should include a reasonable threat for moderate flooding where peak rainfall totals notably exceed amounts conducive for flash flooding and rapid inundation. Rescues and emergency evacuations are possible.",
|
||||
"preparation": "To be safe, remain prepared for the potential of significant flooding rain impacts.",
|
||||
"action": "Dangerous flooding is possible. Failure to take action may result in serious injury or loss of life. If flash flood watches and warnings are issued, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed and do not let down your guard.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Do not drive through existing flood waters that cover the road.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
},
|
||||
},
|
||||
"Elevated": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for minor flooding where peak rainfall totals are near amounts conducive for flash flooding and rapid inundation.",
|
||||
"planning": "Emergency planning should include a reasonable threat for minor flooding where peak rainfall totals are near amounts conducive for localized flash flooding and rapid inundation.",
|
||||
"preparation": "To be safe, prepare for the potential of limited flooding rain impacts.",
|
||||
"action": "Localized flooding is possible. If flash flood watches and warnings are issued, heed recommended actions.",
|
||||
"action": "Localized flooding is possible. If flood related watches and warnings are issued, heed recommended actions.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for minor flooding where peak rainfall totals are near amounts conducive for flash flooding and rapid inundation.",
|
||||
"planning": "Emergency plans should include a reasonable threat for minor flooding where peak rainfall totals are near amounts conducive for localized flash flooding and rapid inundation.",
|
||||
"preparation": "To be safe, prepare for the potential of limited flooding rain impacts.",
|
||||
"action": "Localized flooding is possible. If flash flood watches and warnings are issued, heed recommended actions.",
|
||||
"action": "Localized flooding is possible. If flood related watches and warnings are issued, heed recommended actions.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans should include a reasonable threat for minor flooding where peak rainfall totals are near amounts conducive for flash flooding and rapid inundation.",
|
||||
"preparation": "To be safe, remain prepared for the potential of limited flooding rain impacts.",
|
||||
"action": "Localized flooding is possible. If flash flood watches and warnings are issued, heed recommended actions.",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency plans should include a reasonable threat for minor flooding where peak rainfall totals are near amounts conducive for flash flooding and rapid inundation.",
|
||||
"preparation": "To be safe, remain prepared for the potential of limited flooding rain impacts.",
|
||||
"action": "Localized flooding is possible. If flash flood watches and warnings are issued, heed recommended actions.",
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed and do not let down your guard.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers. Do not drive through existing flood waters that cover the road.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a threat of flooding.",
|
||||
"preparation": "Be safe and remain ready to protect against flooding rain impacts. Stay informed.",
|
||||
"action": "If flood related watches and warnings are in effect, heed recommended actions. Also listen for possible river flood warnings for longer-term impacts along rivers.",
|
||||
},
|
||||
},
|
||||
"None": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning for this event need not include a threat for rainfall flooding. Heavy rain and nuisance flooding may still occur.",
|
||||
"planning": "Emergency planning need not include a threat for rainfall flooding. Locally heavy rain and nuisance flooding may still occur.",
|
||||
"preparation": "Little to no preparations needed to guard against excessive tropical rainfall.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall flooding event.",
|
||||
"action": "Ensure readiness for the next tropical rainfall event.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning for this event need not include a threat for rainfall flooding. Heavy rain and nuisance flooding may still occur.",
|
||||
"planning": "Emergency plans need not include a threat for rainfall flooding. Locally heavy rain and nuisance flooding may still occur.",
|
||||
"preparation": "Little to no preparations needed to guard against excessive tropical rainfall.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall flooding event.",
|
||||
"action": "Ensure readiness for the next tropical rainfall event.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency planning for this event need not include a threat for rainfall flooding. Heavy rain and nuisance flooding may still occur.",
|
||||
"planning": "Emergency considerations need not include a threat for rainfall flooding. Locally heavy rain and nuisance flooding may still occur.",
|
||||
"preparation": "Little to no preparations needed to guard against excessive tropical rainfall.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall flooding event.",
|
||||
"action": "Ensure readiness for the next tropical rainfall event.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Heavy rain and nuisance flooding may still occur. ",
|
||||
"planning": "Locally heavy rain and nuisance flooding may still occur.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall flooding event.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall event.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "Heavy rain and nuisance flooding may still occur.",
|
||||
"default": {
|
||||
"planning": "Locally Heavy rain and nuisance flooding may still occur.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall flooding event.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical rainfall event.",
|
||||
},
|
||||
},
|
||||
},
|
||||
"Tornado": {
|
||||
"Extreme": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for an outbreak of tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths. Numerous tornadoes may occur within short periods of time and in close proximity of one another.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic tornado impacts. Those living in mobile homes should relocate to more substantial shelter. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"planning": "Emergency planning should include a reasonable threat for an outbreak of tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths. Numerous tornadoes may occur within short periods of time and in close proximity of one another.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic tornado impacts. Those living in mobile homes should relocate to more substantial shelter before severe weather arrives.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for an outbreak of tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths. Numerous tornadoes may occur within short periods of time and in close proximity of one another.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic tornado impacts. Those living in mobile homes should relocate to more substantial shelter. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"planning": "When implementing emergency plans, include a reasonable threat for an outbreak of tornadoes." ,
|
||||
"preparation": "To be safe, aggressively prepare for the potential of devastating to catastrophic tornado impacts. Those living in mobile homes should relocate to more substantial shelter before severe weather arrives.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans should include a reasonable threat for an outbreak of tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths. Numerous tornadoes may occur within short periods of time and in close proximity of one another.",
|
||||
"preparation": "To be safe, remain prepared for the potential of devastating to catastrophic tornado impacts. Stay informed and listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. If tornado warnings are issued for your area, quickly move to the safest place within your shelter. Seconds can save lives.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. If a tornado approaches, quickly move to the safest place within your shelter.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency plans should continue to include a reasonable threat for an outbreak of tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths. Numerous tornadoes may occur within short periods of time and in close proximity of one another.",
|
||||
"preparation": "To be safe, remain prepared for the potential of devastating to catastrophic tornado impacts. Stay informed and do not let down your guard/",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. If tornado watches and warnings are issued, heed recommended actions.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for an outbreak of tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against the potential of devastating to catastrophic tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
},
|
||||
"High": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for numerous tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive tornado impacts. Those living in mobile homes should relocate to more substantial shelter. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive tornado impacts. Those living in mobile homes should relocate to more substantial shelter before severe weather arrives.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for numerous tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive tornado impacts. Those living in mobile homes should relocate to more substantial shelter. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"planning": "When implementing emergency plans, include a reasonable threat for numerous tornadoes.",
|
||||
"preparation": "To be safe, aggressively prepare for the potential of extensive tornado impacts. Those living in mobile homes should relocate to more substantial shelter before severe weather arrives.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans should include a reasonable threat for numerous tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths.",
|
||||
"preparation": "To be safe, remain prepared for the potential of extensive tornado impacts. Stay informed and listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. If tornado warnings are issued for your area, quickly move to the safest place within your shelter. Seconds can save lives.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. If a tornado approaches, quickly move to the safest place within your shelter.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency plans should include a reasonable threat for numerous tornadoes, with several possibly strong or violent in intensity and with longer and wider damage paths.",
|
||||
"preparation": "To be safe, remain prepared for the potential of extensive tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or significant loss of life. If tornado watches and warnings are issued, heed recommended actions.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for numerous tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against the potential of extensive tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
},
|
||||
"Mod": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for scattered tornadoes, with a few possibly strong in intensity.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant tornado impacts. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant tornado impacts.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for scattered tornadoes, with a few possibly strong in intensity.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant tornado impacts. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
},
|
||||
"planning": "When implementing emergency plans, include should include a reasonable threat for scattered tornadoes.",
|
||||
"preparation": "To be safe, earnestly prepare for the potential of significant tornado impacts.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.", },
|
||||
"hunker down": {
|
||||
"planning": "Emergency planning should continue to include a reasonable threat for scattered tornadoes, with a few possibly strong in intensity.",
|
||||
"preparation": "To be safe, remain prepared for the potential of significant tornado impacts. Stay informed and listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or loss of life. If tornado warnings are issued for your area, quickly move to the safest place within your shelter. Seconds can save lives.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. If a tornado approaches, quickly move to the safest place within your shelter.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency planning should include a reasonable threat for scattered tornadoes, with a few possibly strong in intensity.",
|
||||
"preparation": "To be safe, remain prepared prepare for the potential of significant tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Failure to adequately shelter may result in serious injury or loss of life. If tornado watches and warnings are issued for your area, heed recommended actions.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for scattered tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against the potential of significant tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
},
|
||||
"Elevated": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning should include a reasonable threat for isolated tornadoes, mostly with shorter and narrower damage paths.",
|
||||
"preparation": "To be safe, prepare for the potential of limited tornado impacts. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury, and in some cases loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"planning": "Emergency planning should include a reasonable threat for isolated tornadoes, mostly with shorter and narrower damage paths.",
|
||||
"preparation": "To be safe, prepare for the potential of limited tornado impacts.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning should include a reasonable threat for isolated tornadoes, mostly with shorter and narrower damage paths.",
|
||||
"preparation": "To be safe, prepare for the potential of limited tornado impacts. Listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury, and in some cases loss of life. Keep a watchful eye to the sky and a listening ear for warning alerts. Be ready to find shelter quickly.",
|
||||
"planning": "When implementing emergency plans, include a reasonable threat for isolated tornadoes.",
|
||||
"preparation": "To be safe, prepare for the potential of limited tornado impacts.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency planning should include a reasonable threat for isolated tornadoes, mostly with shorter and narrower damage paths.",
|
||||
"preparation": "To be safe, remain prepared for the potential of limited tornado impacts. Stay informed and listen for tornado watches and warnings.",
|
||||
"action": "Failure to adequately shelter may result in serious injury, and in some cases loss of life. If tornado warnings are issued for your area, quickly move to the safest place within your shelter. Seconds can save lives.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. If a tornado approaches, quickly move to the safest place within your shelter.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Emergency planning should continue to include a reasonable threat for isolated tornadoes, mostly with shorter and narrower damage paths.",
|
||||
"preparation": "To be safe, remain prepared for the potential of limited tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Failure to adequately shelter may result in serious injury, and in some cases loss of life. If tornado watches and warnings are issued for your area, heed recommended actions.",
|
||||
"planning": "Emergency considerations should include a reasonable threat for tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against tornado impacts. Stay informed and do not let down your guard.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "",
|
||||
"preparation": "",
|
||||
"action": "",
|
||||
"default": {
|
||||
"planning": "Emergency considerations should include a reasonable threat for isolated tornadoes.",
|
||||
"preparation": "Be safe and remain ready to protect against the potential of limited tornado impacts. Stay informed.",
|
||||
"action": "Listen for tornado watches and warnings. Be ready to shelter quickly if a tornado approaches.",
|
||||
},
|
||||
},
|
||||
"None": {
|
||||
"check plans": {
|
||||
"planning": "Emergency planning for this event need not include a threat for tornadoes. Showers and thunderstorms with strong wind gusts may still occur.",
|
||||
"planning": "Emergency planning need not include a threat for tornadoes. Showers and thunderstorms with strong gusty winds may still occur.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical tornadoes.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical tornado event.",
|
||||
"action": "Ensure readiness for the next tropical tornado event.",
|
||||
},
|
||||
"complete preparations": {
|
||||
"planning": "Emergency planning for this event need not include a threat for tornadoes. Showers and thunderstorms with strong wind gusts may still occur.",
|
||||
"planning": "Emergency plans need not include a threat for tornadoes. Showers and thunderstorms with strong gusty winds may still occur.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical tornadoes.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical tornado event.",
|
||||
"action": "Ensure readiness for the next tropical tornado event.",
|
||||
},
|
||||
"hunker down": {
|
||||
"planning": "Emergency plans for this event need not include a threat for tornadoes. Showers and thunderstorms with strong wind gusts may still occur.",
|
||||
"planning": "Emergency considerations need not include a threat for tornadoes. Showers and thunderstorms with strong gusty winds may still occur.",
|
||||
"preparation": "Little to no preparations needed to guard against tropical tornadoes.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical tornado event.",
|
||||
"action": "Ensure readiness for the next tropical tornado event.",
|
||||
},
|
||||
"recovery": {
|
||||
"planning": "Showers and thunderstorms with strong wind gusts may still occur.",
|
||||
"preparation": "Exercise due safety when moving about.",
|
||||
"planning": "Showers and thunderstorms with strong gusty winds may still occur.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical tornado event.",
|
||||
},
|
||||
"nothing to see here": {
|
||||
"planning": "Showers and thunderstorms with strong wind gusts may occur.",
|
||||
"preparation": "Exercise due safety when moving about.",
|
||||
"default": {
|
||||
"planning": "Showers and thunderstorms with strong gusty winds may still occur.",
|
||||
"preparation": "Exercise due safety.",
|
||||
"action": "Review your seasonal plan and ensure readiness for the next tropical tornado event.",
|
||||
},
|
||||
},
|
||||
|
@ -561,21 +559,21 @@ ThreatStatements = {
|
|||
}
|
||||
PotentialImpactStatements = {
|
||||
"Wind": {
|
||||
"Extreme": ["Structural damage to sturdy buildings with some experiencing complete roof and wall failures. Complete destruction of mobile homes. Damage greatly accentuated by large airborne projectiles. Locations may be uninhabitable for weeks or months.",
|
||||
"Extreme": ["Structural damage to sturdy buildings, some with complete roof and wall failures. Complete destruction of mobile homes. Damage greatly accentuated by large airborne projectiles. Locations may be uninhabitable for weeks or months.",
|
||||
"Numerous large trees snapped or uprooted along with fences and roadway signs blown over.",
|
||||
"Many roads impassible from large debris, and more within urban or heavily wooded places. Many bridges, causeways, and access routes impassible.",
|
||||
"Many roads impassable from large debris, and more within urban or heavily wooded places. Many bridges, causeways, and access routes impassable.",
|
||||
"Widespread power and communications outages."],
|
||||
"High": ["Considerable roof damage to sturdy buildings, with some having window, door, and garage door failures leading to structural damage. Mobile homes severely damaged, with some destroyed. Damage accentuated by airborne projectiles. Locations may be uninhabitable for weeks.",
|
||||
"High": ["Considerable roof damage to sturdy buildings, with some having window, door, and garage door failures leading to structural damage. Mobile homes severely damaged, with some destroyed. Damage accentuated by airborne projectiles. Locations may be uninhabitable for weeks.",
|
||||
"Many large trees snapped or uprooted along with fences and roadway signs blown over.",
|
||||
"Some roads impassible from large debris, and more within urban or heavily wooded places. Several bridges, causeways, and access routes impassible.",
|
||||
"Some roads impassable from large debris, and more within urban or heavily wooded places. Several bridges, causeways, and access routes impassable.",
|
||||
"Large areas with power and communications outages."],
|
||||
"Mod": ["Some damage to roofing and siding materials, along with damage to porches, awnings, carports, and sheds. A few buildings experiencing window, door, and garage door failures. Mobile homes damaged, especially if unanchored. Unsecured lightweight objects become dangerous projectiles.",
|
||||
"Several large trees snapped or uprooted, but with greater numbers in places where trees are shallow rooted. Several fences and roadway signs blown over.",
|
||||
"Some roads impassible from large debris, and more within urban or heavily wooded places. A few bridges, causeways, and access routes impassible.",
|
||||
"Some roads impassable from large debris, and more within urban or heavily wooded places. A few bridges, causeways, and access routes impassable.",
|
||||
"Scattered power and communications outages, but more prevalent in areas with above ground lines."],
|
||||
"Elevated": ["Damage to porches, awnings, carports, sheds, and unanchored mobile homes. Unsecured lightweight objects blown about.",
|
||||
"Many large tree limbs broken off. A few trees snapped or uprooted, but with greater numbers in places where trees are shallow rooted. Some fences and roadway signs blown over.",
|
||||
"A few roads impassible from debris, particularly within urban or heavily wooded places. Hazardous driving conditions on bridges and other elevated roadways.",
|
||||
"A few roads impassable from debris, particularly within urban or heavily wooded places. Hazardous driving conditions on bridges and other elevated roadways.",
|
||||
"Scattered power and communications outages."],
|
||||
"None": ["Little to no potential impacts from wind."],
|
||||
},
|
||||
|
@ -584,7 +582,7 @@ PotentialImpactStatements = {
|
|||
"Near-shore escape routes and secondary roads washed out or severely flooded. Flood control systems and barriers may become stressed.",
|
||||
"Extreme beach erosion. New shoreline cuts possible.",
|
||||
"Massive damage to marinas, docks, boardwalks, and piers. Numerous small craft broken away from moorings with many lifted onshore and stranded."],
|
||||
"High": ["Large areas of deep inundation, with storm surge flooding accentuated by battering waves. Structural damage to buildings, with several washing away. Damage compounded by floating debris. Locations may be uninhabitable for an extended period.",
|
||||
"High": ["Large areas of deep inundation with storm surge flooding accentuated by battering waves. Structural damage to buildings, with several washing away. Damage compounded by floating debris. Locations may be uninhabitable for an extended period.",
|
||||
"Large sections of near-shore escape routes and secondary roads washed out or severely flooded. Flood control systems and barriers may become stressed.",
|
||||
"Severe beach erosion with significant dune loss.",
|
||||
"Major damage to marinas, docks, boardwalks, and piers. Many small craft broken away from moorings, especially in unprotected anchorages with some lifted onshore and stranded."],
|
||||
|
@ -601,20 +599,20 @@ PotentialImpactStatements = {
|
|||
"Flooding Rain": {
|
||||
"Extreme": ["Extreme rainfall flooding may prompt numerous evacuations and rescues.",
|
||||
"Rivers and tributaries may overwhelmingly overflow their banks in many places with deep moving water. Small streams, creeks, canals, arroyos, and ditches may become raging rivers. In mountain areas, deadly runoff may rage down valleys while increasing susceptibility to rockslides and mudslides. Flood control systems and barriers may become stressed.",
|
||||
"Flood waters can enter numerous structures within multiple communities, with some structures becoming uninhabitable or washed away. Numerous places where flood waters may cover escape routes. Streets and parking lots become rivers of raging water with underpasses submerged. Driving conditions become very dangerous. Numerous road and bridge closures with some weakened or washed out."],
|
||||
"Flood waters can enter numerous structures within multiple communities, some structures becoming uninhabitable or washed away. Numerous places where flood waters may cover escape routes. Streets and parking lots become rivers of raging water with underpasses submerged. Driving conditions become very dangerous. Numerous road and bridge closures with some weakened or washed out."],
|
||||
"High": ["Major rainfall flooding may prompt many evacuations and rescues.",
|
||||
"Rivers and tributaries may rapidly overflow their banks in multiple places. Small streams, creeks, canals, arroyos, and ditches may become dangerous rivers. In mountain areas, destructive runoff may run quickly down valleys while increasing susceptibility to rockslides and mudslides. Flood control systems and barriers may become stressed.",
|
||||
"Flood waters can enter many structures within multiple communities, with some structures becoming uninhabitable or washed away. Many places where flood waters may cover escape routes. Streets and parking lots become rivers of moving water with underpasses submerged. Driving conditions become dangerous. Many road and bridge closures with some weakened or washed out."],
|
||||
"Flood waters can enter many structures within multiple communities, some structures becoming uninhabitable or washed away. Many places where flood waters may cover escape routes. Streets and parking lots become rivers of moving water with underpasses submerged. Driving conditions become dangerous. Many road and bridge closures with some weakened or washed out."],
|
||||
"Mod": ["Moderate rainfall flooding may prompt several evacuations and rescues.",
|
||||
"Rivers and tributaries may quickly become swollen with swifter currents and overspill their banks in a few places, especially in usually vulnerable spots. Small streams, creeks, canals, arroyos, and ditches overflow.",
|
||||
"Flood waters can enter some structures or weaken foundations. Several places may experience expanded areas of rapid inundation at underpasses, low-lying spots, and poor drainage areas. Some streets and parking lots take on moving water as storm drains and retention ponds overflow. Driving conditions become hazardous. Some road and bridge closures."],
|
||||
"Elevated": ["Localized rainfall flooding may prompt a few evacuations.",
|
||||
"Rivers and tributaries may quickly rise with swifter currents. Small streams, creeks, canals, arroyos, and ditches may become swollen and overflow in spots.",
|
||||
"Flood waters can enter a few structures, especially in usually vulnerable spots. A few places where rapid ponding of water occurs at underpasses, low-lying spots, and poor drainage areas. Several storm drains and retention ponds may become near-full and begin to overflow. Some brief road and bridge closures."],
|
||||
"Flood waters can enter a few structures, especially in usually vulnerable spots. A few places where rapid ponding of water occurs at underpasses, low-lying spots, and poor drainage areas. Several storm drains and retention ponds become near-full and begin to overflow. Some brief road and bridge closures."],
|
||||
"None": ["Little to no potential impacts from flooding rain."],
|
||||
},
|
||||
"Tornado": {
|
||||
"Extreme": ["The occurrence of an outbreak of tornadoes can greatly hinder the execution of emergency plans during tropical events.",
|
||||
"Extreme": ["The occurrence of an outbreak of tornadoes can greatly hinder the execution of emergency plans during tropical events. ",
|
||||
"Many places may experience tornado damage, with several spots of immense destruction, power loss, and communications failures.",
|
||||
"Locations could realize sturdy buildings demolished, structures upon weak foundations swept away, mobile homes obliterated, large trees twisted and snapped with some debarked, vehicles lifted off the ground and thrown with distance, and small boats destroyed. Large and deadly projectiles can add considerably to the toll."],
|
||||
"High": ["The occurrence of numerous tornadoes can greatly hinder the execution of emergency plans during tropical events.",
|
||||
|
@ -630,9 +628,13 @@ 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 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."]
|
||||
EvacuationStatements = ["WATCH/WARNING PHASE - 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 all essential materials from your emergency supplies kit. Let others know where you are going and when you intend to arrive.",
|
||||
"WATCH/WARNING PHASE - 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. Drivers should not use cell phones while operating vehicles.",
|
||||
"WATCH/WARNING PHASE - 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.",
|
||||
"WATCH/WARNING PHASE - If you are exceptionally vulnerable to wind or water hazards from tropical systems, consider voluntary evacuation, especially if being officially recommended. Relocate to a predetermined shelter or safe destination.",
|
||||
"WATCH/WARNING PHASE - If evacuating away from the area or relocating to a nearby shelter, leave early before weather conditions become hazardous.",
|
||||
"IMMINENT/ONGOING PHASE - Do not return to evacuated areas until hazardous winds diminish and flood waters abate.",
|
||||
"RECOVERY PHASE - Do not return to evacuated areas until it is safe. Listen for the all-clear signal from local authorities."]
|
||||
|
||||
OtherPreparednessActions = {
|
||||
|
||||
|
@ -650,7 +652,7 @@ OtherPreparednessActions = {
|
|||
"Outside preparations should be wrapped up as soon as possible before weather conditions completely deteriorate. Any remaining evacuations and relocations should be expedited before the onset of tropical storm force wind.",
|
||||
"If you are relocating to safe shelter, leave as early as possible. If heading to a community shelter, become familiar with the shelter rules before arrival, especially if you have special needs or own a pet. Take essential items with you from your Emergency Supplies Kit. Check the latest weather forecast before departing.",
|
||||
"Failure to adequately shelter may result in serious injury or loss of life. Always heed the advice of local officials and comply with any orders that are issued. Remember, during the storm 9 1 1 Emergency Services may not be able to immediately respond if conditions are unsafe. This should be a big factor in your decision making.",
|
||||
"Check-in with your Emergency Points of Contact among family, friends, and workmates. Inform them of your status and well-being. Let them know how you intend to ride out the storm and when you plan to check-in again.",
|
||||
"Check-in with your emergency points of contact among family, friends, and workmates. Inform them of your status and well-being. Let them know how you intend to ride out the storm and when you plan to check-in again.",
|
||||
"Keep cell phones well charged and handy. Also, cell phone chargers for automobiles can be helpful after the storm. Locate your chargers and keep them with your cell phone.",
|
||||
"In emergencies it is best to remain calm. Stay informed and focused on the situation at hand. Exercise patience with those you encounter. Be a Good Samaritan and helpful to others.",
|
||||
"If relocating to a nearby shelter or to the home of a family member or friend, drive with extra caution, especially on secondary roads. Remember, many bridges and causeways will be closed once higher winds arrive. Also, if you encounter water covering the road, seek an alternate route. Always obey official road signs for closures and detours.",
|
||||
|
@ -662,20 +664,20 @@ OtherPreparednessActions = {
|
|||
"Do not venture outside while in the eye of a hurricane. Within the eye, weather conditions may temporarily improve which can be misleading. Once the eye passes, the wind will change direction and return to dangerous speeds. Heavy rain will also return. Be smart and remain safely hidden from the storm.",
|
||||
"Do not be a thrill seeker or risk your life for senseless photos or videos. Be wise and avoid becoming another statistic.",
|
||||
"Be ready to move to the identified safe room if your home or shelter begins to fail. Quickly move to an interior room on the lowest floor. Put as many sturdy walls between you and the storm as you can. Protect your head and body.",
|
||||
"When major hurricanes make landfall, extreme winds bring a tremendous threat to life and cause devastating to catastrophic damage. The extent of these extreme winds is usually confined to locations near the coast and does not tend to cover an overly large area. Yet, this area will realize the brunt of the storm. At the onset of landfall, listen for extreme wind warnings. If issued for you area, move to the safest place within your home or shelter. Take the same life-saving actions as if it were a violent tornado."],
|
||||
"When major hurricanes make landfall, extreme winds bring a tremendous threat to life and cause devastating to catastrophic damage. During landfall, listen for extreme wind warnings which indicate the exact timing and location of these incredible life-threatening winds. If issued for you area, move to the safest place within your home or shelter. Take the same life-saving actions as if it were a violent tornado."],
|
||||
"recovery": ["Remain safely sheltered until the storm fully passes. Once conditions improve, be careful going outside. Stay away from downed power lines and hazardous debris.",
|
||||
"If your home or shelter was damaged, be alert to the smell of natural gas leaks and cautious around exposed electrical wiring, broken glass, jagged metal and wood, and protruding nails and screws.",
|
||||
"Check to see if everyone in your group is OK. Administer first aid to those who are injured. Call 9 1 1 for any serious injuries. Remember, it may be more difficult for emergency responders to arrive quickly in the time period immediately following the storm.",
|
||||
"Check-in with your Emergency Points of Contact. Let them know of your status and well-being. Keep conversations short and to the point. Do not tie up communications systems.",
|
||||
"Check-in with your emergency points of contact. Let them know of your status and well-being. Keep conversations short and to the point. Do not tie up communications systems.",
|
||||
"Be a good neighbor and check on those living next to you. Be neighborly and lend a helping hand.",
|
||||
"Those who rode out the storm away from their home or business are likely anxious to return. However, allow some time for work crews to make a clear path for emergency vehicles. Downed power lines and trees may be blocking roads and flood waters may have washed out or overspread sections of key travel routes. Traffic lights may also be out of service.",
|
||||
"Do not attempt to return to evacuated areas until local authorities give the All-Clear signal.",
|
||||
"Do not go sightseeing within impacted communities simply to observe storm damage. Sightseers can interfere with the timeliness of rescuers and first responders while needlessly jeopardizing their own lives and the lives of others.",
|
||||
"Do not go sightseeing within impacted communities simply to observe storm damage. Sightseers can interfere with the timeliness of rescuers and first responders to needlessly jeopardize lives.",
|
||||
"When inspecting damage, use flashlights rather than candles or flamed lighting. Be aware of sparks that can ignite leaking gas or other flammables.",
|
||||
"Do not go up on your roof until the rain and strong winds have subsided. Ladders can be slippery in the rain and unexpected wind gusts can blow you off of the roof. Do not risk bodily harm in an attempt to reduce property damage.",
|
||||
"When clearing out fallen trees, be careful with chain saws and axes. Always wear protective gear and keep others at a safe distance. Use these tools according to operating manuals and safety instruction. Leaning trees and those which have fallen on roof tops can be especially challenging. If you are not in good health or unsure about what you are doing, have someone else with tree cutting experience do the job. Never cut trees without a partner.",
|
||||
"If using a generator, avoid carbon monoxide poisoning by following instructions by the manufacturer. Make sure that the generator is run in a well ventilated space.",
|
||||
"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."],
|
||||
"Problems with sewer backups can further contaminate standing flood waters. Keep children away. Also, listen for boil water alerts relative to communities whose tap water may have become non-potable."],
|
||||
}
|
||||
|
||||
AdditionalSources = ["- For information on appropriate preparations see ready.gov",
|
||||
|
|
|
@ -8,243 +8,243 @@
|
|||
<contribute xsi:type="subMenu" menuText="Hail Products" id="MRMS_HAIL">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Maximum Estimated Size of Hail (MESH)" id="MESH">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESH"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="MESH Tracks (30 min. accum.)" id="MESH30">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESHTrack30min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="MESH Tracks (60 min. accum.)" id="MESH60">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESHTrack60min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="MESH Tracks (120 min. accum.)" id="MESH120">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESHTrack120min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="MESH Tracks (240 min. accum.)" id="MESH240">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESHTrack240min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="MESH Tracks (360 min. accum.)" id="MESH360">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESHTrack360min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="MESH Tracks (1440 min. accum.)" id="MESH1440">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MESHTrack1440min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Probability Of Severe Hail (POSH)" id="POSH">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="POSH"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Severe Hail Index (SHI)" id="SHI">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="SHI"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="Lightning Products" id="MRMS_LIGHTNING">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Cloud-to-Ground Lightning Density (1 min.)" id="LightDensity1min">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="LightningDensity1min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Cloud-to-Ground Lightning Density (5 min.)" id="LightDensity5min">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="LightningDensity5min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Cloud-to-Ground Lightning Density (15 min.)" id="LightDensity15min">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="LightningDensity15min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Cloud-to-Ground Lightning Density (30 min.)" id="LightDensity30min">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="LightningDensity30min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Cloud-to-Ground Lightning Probability (0-30 min.)" id="LightProb30min">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="LightningProbabilityNext30min"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="Precipitation Products" id="MRMS_PRECIPITATION">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Surface Precipitation Type (SPT)" id="SfcPrecipType">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="PrecipType"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Surface Precipitation Rate (SPR)" id="RadarPrecipRate">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="PrecipRate"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Radar Quality Index (RQI)" id="RadarQualityIndex">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarQualityIndex"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Seamless Hybrid Scan Reflectivity (SHSR)" id="SHSRVPR">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="SeamlessHSR"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="QPE - Radar Only">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="1 hour Accumulation" id="RadarOnly01hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE01H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="3 hour Accumulation" id="RadarOnly03hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE03H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="6 hour Accumulation" id="RadarOnly06hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE06H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="12 hour Accumulation" id="RadarOnly12hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE12H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="24 hour Accumulation" id="RadarOnly24hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE24H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="48 hour Accumulation" id="RadarOnly48hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE48H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="72 hour Accumulation" id="RadarOnly72hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="RadarOnlyQPE72H"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="QPE - Gauge Only">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="1 hour Accumulation" id="GaugeOnly01hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE01H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="3 hour Accumulation" id="GaugeOnly03hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE03H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="6 hour Accumulation" id="GaugeOnly06hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE06H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="12 hour Accumulation" id="GaugeOnly12hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE12H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="24 hour Accumulation" id="GaugeOnly24hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE24H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="48 hour Accumulation" id="GaugeOnly48hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE48H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="72 hour Accumulation" id="GaugeOnly72hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeOnlyQPE72H"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="QPE - Radar w/ Gauge Bias Correction">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="1 hour Accumulation" id="GaugeCorr01hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE01H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="3 hour Accumulation" id="GaugeCorr03hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE03H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="6 hour Accumulation" id="GaugeCorr06hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE06H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="12 hour Accumulation" id="GaugeCorr12hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE12H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="24 hour Accumulation" id="GaugeCorr24hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE24H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="48 hour Accumulation" id="GaugeCorr48hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE48H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="72 hour Accumulation" id="GaugeCorr72hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="GaugeCorrQPE72H"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="QPE - Mountain Mapper">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="1 hour Accumulation" id="MountainMapper01hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE01H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="3 hour Accumulation" id="MountainMapper03hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE03H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="6 hour Accumulation" id="MountainMapper06hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE06H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="12 hour Accumulation" id="MountainMapper12hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE12H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="24 hour Accumulation" id="MountainMapper24hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE24H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="48 hour Accumulation" id="MountainMapper48hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE48H"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="72 hour Accumulation" id="MountainMapper72hr">
|
||||
<substitute key="levelOneValue" value="0.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MountainMapperQPE72H"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
|
@ -252,97 +252,97 @@
|
|||
<contribute xsi:type="subMenu" menuText="Reflectivity Products" id="MRMS_REFLECTIVITY">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Composite Reflectivity" id="CompZ">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MergedReflectivityQCComposite"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Composite Reflectivity Height" id="CompZH">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="HeightCompositeReflectivity"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Reflectivity At Lowest Altitude (RALA)" id="REFLA">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="ReflectivityAtLowestAltitude"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Vertically Integrated Ice (VII)" id="VII">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="VII"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Vertically Integrated Liquid (VIL)" id="MRMSVIL">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="MRMSVIL"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="Echo Tops" id="MRMS_ECHO">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="18 dBZ Echo Top" id="18ET">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="EchoTop18"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="30 dBZ Echo Top" id="30ET">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="EchoTop30"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="50 dBZ Echo Top" id="50ET">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="EchoTop50"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="60 dBZ Echo Top" id="60ET">
|
||||
<substitute key="levelOneValue" value="500.0" />
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="EchoTop60"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="Isothermal Reflectivity" id="REF_ISOTHERMAL">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Reflectivity at 0°C" id="REF0C">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="Reflectivity0C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Reflectivity at -5°C" id="REFM5C">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="ReflectivityM5C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Reflectivity at -10°C" id="REFM10C">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="ReflectivityM10C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Reflectivity at -15°C" id="REFM15C">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="ReflectivityM15C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Reflectivity at -20°C" id="REFM20C">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="ReflectivityM20C"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
<contribute xsi:type="subMenu" menuText="Thickness" id="REF_THICKNESS">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Height of 50dBZ Echo Above -20°C" id="H50253">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="H50AboveM20C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Height of 60dBZ Echo Above -20°C" id="H60253">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="H60AboveM20C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Height of 50dBZ Echo Above 0°C" id="H50273">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="H50Above0C"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Height of 60dBZ Echo Above 0°C" id="H60273">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_1000"/>
|
||||
<substitute key="parameterID" value="H60Above0C"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
|
@ -350,73 +350,73 @@
|
|||
<contribute xsi:type="subMenu" menuText="Velocity Products" id="MRMS_VELOCITY">
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Azimuthal Shear (0-2km AGL)" id="AZ02">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="MergedAzShear02kmAGL"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Rotation Tracks (30 min. accum.)" id="ROTLL30">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackLL30min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Rotation Tracks (60 min. accum.)" id="ROTLL60">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackLL60min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Rotation Tracks (120 min. accum.)" id="ROTLL120">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackLL120min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Rotation Tracks (240 min. accum.)" id="ROTLL240">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackLL240min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Rotation Tracks (360 min. accum.)" id="ROTLL360">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackLL360min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Low-Level Rotation Tracks (1440 min. accum.)" id="ROTLL1440">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackLL1440min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Azimuthal Shear (3-6km AGL)" id="AZ36">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="MergedAzShear36kmAGL"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Rotation Tracks (30 min. accum.)" id="ROTML30">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackML30min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Rotation Tracks (60 min. accum.)" id="ROTML60">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackML60min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Rotation Tracks (120 min. accum.)" id="ROTML120">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackML120min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Rotation Tracks (240 min. accum.)" id="ROTML240">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackML240min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Rotation Tracks (360 min. accum.)" id="ROTML360">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackML360min"/>
|
||||
</contribute>
|
||||
<contribute xsi:type="bundleItem" file="bundles/mrms/mrms2D.xml" menuText="Mid-Level Rotation Tracks (1440 min. accum.)" id="ROTML1440">
|
||||
<substitute key="levelOneValue" value="500.0"/>
|
||||
<substitute key="datasetID" value="MRMS"/>
|
||||
<substitute key="datasetID" value="MRMS_0500"/>
|
||||
<substitute key="parameterID" value="RotationTrackML1440min"/>
|
||||
</contribute>
|
||||
</contribute>
|
||||
</menuTemplate>
|
||||
</menuTemplate>
|
||||
|
|
|
@ -43,6 +43,7 @@ import com.raytheon.viz.mpe.util.ReadTemperatureStationList;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 31, 2009 snaples Initial creation
|
||||
* Feb 5, 2015 17101 snaples Updated max_stations to use size of dqc.precip_stations.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -72,13 +73,9 @@ public class GroupEditCalls {
|
|||
|
||||
int pcpn_time = dqc.pcpn_time;
|
||||
|
||||
ReadPrecipStationList rp = new ReadPrecipStationList();
|
||||
int max_stations = dqc.precip_stations.size();
|
||||
|
||||
ReadTemperatureStationList rt = new ReadTemperatureStationList();
|
||||
|
||||
int max_stations = rp.getNumPstations();
|
||||
|
||||
int max_tstations = rt.getNumTstations();
|
||||
int max_tstations = dqc.temperature_stations.size();
|
||||
|
||||
public void apply_group()
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Jan 7, 2015 16954 cgobs Fix for cv_use issue - using getFieldName() in certain parts.
|
||||
* Feb 4, 2015 17094 cgobs Fix for fieldType being too long for mapx_field_type column in RWResult table.
|
||||
* </pre>
|
||||
**/
|
||||
package com.raytheon.viz.mpe.ui.actions;
|
||||
|
@ -33,8 +34,10 @@ import java.io.IOException;
|
|||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.imageio.ImageWriter;
|
||||
|
@ -337,7 +340,10 @@ public class SaveBestEstimate {
|
|||
Rwresult pRWResultNode = pRWResultHead.get(0);
|
||||
|
||||
/* Update the elements in the RWResult node. */
|
||||
pRWResultNode.setMapxFieldType(fldtype);
|
||||
|
||||
fldtype = checkAndModifyMapxFieldType(fldtype);
|
||||
|
||||
pRWResultNode.setMapxFieldType(fldtype.toLowerCase());
|
||||
pRWResultNode.setAutoSave(asave);
|
||||
pRWResultNode.setDrawPrecip(drpr);
|
||||
pRWResultNode.setLastSaveTime(SimulatedTime.getSystemTime()
|
||||
|
@ -359,4 +365,32 @@ public class SaveBestEstimate {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
private static String checkAndModifyMapxFieldType(String fieldType) {
|
||||
|
||||
// This method changes fieldType to lowercase.
|
||||
// It also shortens fieldTypes as needed to fit into the mapx_field_type column in the RWResult table.
|
||||
// Note: the mapx_field_type column is informational only. It is not used by the code
|
||||
// other than reading and writing from and to the database.
|
||||
|
||||
String newFieldType = null;
|
||||
String lowerCaseFieldType = fieldType.toLowerCase();
|
||||
|
||||
final Map<String,String> conversionTable = new HashMap<String , String>();
|
||||
|
||||
conversionTable.put("localfield1", "localfld1");
|
||||
conversionTable.put("localfield2", "localfld2");
|
||||
conversionTable.put("localfield3", "localfld3");
|
||||
|
||||
conversionTable.put("avgrdmosaic", "avgrdmos");
|
||||
conversionTable.put("maxrdmosaic", "maxrdmos");
|
||||
|
||||
|
||||
newFieldType = conversionTable.get(lowerCaseFieldType);
|
||||
if (newFieldType == null)
|
||||
{
|
||||
newFieldType = lowerCaseFieldType;
|
||||
}
|
||||
return newFieldType;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 9, 2009 snaples Initial creation
|
||||
* Feb 5, 2015 17101 snaples Fixed issue with writing zero length bad values file.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -51,8 +52,7 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
|
|||
public class BadValues {
|
||||
BufferedReader in = null;
|
||||
DailyQcUtils dqc = DailyQcUtils.getInstance();
|
||||
ReadPrecipStationList rp = new ReadPrecipStationList();
|
||||
private int max_stations = rp.getNumPstations();
|
||||
private int max_stations = dqc.precip_stations.size();
|
||||
|
||||
|
||||
public void read_bad_values(String precd, int m) {
|
||||
|
@ -194,7 +194,7 @@ public class BadValues {
|
|||
// ier=sprintf(ibuf,"%s %s %d %f\n",bad_values[i].hb5,bad_values[i].parm,
|
||||
// bad_values[i].quart,bad_values[i].fvalue);
|
||||
|
||||
ibuf = String.format("%s %s %d %f", bad_values[i].hb5,
|
||||
ibuf = String.format("%s %s %d %4.2f", bad_values[i].hb5,
|
||||
bad_values[i].parm, bad_values[i].quart,
|
||||
bad_values[i].fvalue);
|
||||
out.write(ibuf);
|
||||
|
|
|
@ -41,6 +41,7 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 11, 2009 snaples Initial creation
|
||||
* Feb 5, 2015 17101 snaples Updated max_stations to use size of dqc.precip_stations.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -68,8 +69,7 @@ public class GetBadSnotel {
|
|||
/* Retrieve the number of days to QC data for. */
|
||||
num_qc_days = dqc.qcDays;
|
||||
|
||||
ReadPrecipStationList pl = new ReadPrecipStationList();
|
||||
int max_stations = pl.getNumPstations();
|
||||
int max_stations = dqc.precip_stations.size();
|
||||
// Pdata[] pdata = DailyQcUtils.pdata;
|
||||
|
||||
for (j = 0; j < num_qc_days; j++) {
|
||||
|
|
|
@ -36,6 +36,7 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Feb 23, 2009 snaples Initial creation
|
||||
* Feb 3, 2015 16993 snaples Fixed if condition on cparm.
|
||||
* Mar 2, 2015 15660 snaples Fixed issue with if statement testing CPARM and checking for both values to be true, broken logic.
|
||||
*
|
||||
* </pre>
|
||||
|
|
|
@ -43,8 +43,9 @@ import com.raytheon.viz.mpe.core.MPEDataManager;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Feb 24, 2009 snaples Initial creation
|
||||
* April , 2012 8672 lbousaidi fixed the reading of the PRISM data.
|
||||
* Mar 2, 2015 15660 snaples Fixed problem with color scale using wrong values. Causing grids to be all zeros.
|
||||
* April , 2012 8672 lbousaidi fixed the reading of the PRISM data.
|
||||
* Feb 3, 2015 16993 snaples fixed color scale data conversion issue.
|
||||
* Mar 2, 2015 15660 snaples Fixed problem with color scale using wrong values. Causing grids to be all zeros.
|
||||
* </pre>
|
||||
*
|
||||
* @author snaples
|
||||
|
|
|
@ -86,6 +86,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
|
|||
* Jul 22, 2014 3419 jsanchez Cleaned up converFeAreaToPartList.
|
||||
* Sep 14, 2014 ASM #641 dhuffman Filtered out cases where Areas do not match Zones by using
|
||||
* refactored WarngenLayer::filterArea.
|
||||
* Mar 9, 2014 ASM #17190 D. Friedman Use fipsField and areaField for unique area ID.
|
||||
* </pre>
|
||||
*
|
||||
* @author chammack
|
||||
|
@ -191,8 +192,7 @@ public class Area {
|
|||
}
|
||||
}
|
||||
|
||||
List<String> uniqueFips = new ArrayList<String>();
|
||||
List<String> uniqueCountyname = new ArrayList<String>();
|
||||
List<String> uniqueAreaIDs = new ArrayList<String>();
|
||||
List<AffectedAreas> areas = new ArrayList<AffectedAreas>();
|
||||
for (GeospatialData regionFeature : countyMap.values()) {
|
||||
Geometry regionGeom = regionFeature.geometry;
|
||||
|
@ -272,14 +272,15 @@ public class Area {
|
|||
|
||||
area.points = pointList.toArray(new String[pointList.size()]);
|
||||
}
|
||||
String countyName = (String) regionFeature.attributes
|
||||
.get("COUNTYNAME");
|
||||
if (uniqueFips.contains(area.fips) == false
|
||||
|| !uniqueCountyname.contains(countyName)) {
|
||||
uniqueFips.add(area.fips);
|
||||
if (countyName != null) {
|
||||
uniqueCountyname.add(countyName);
|
||||
}
|
||||
/*
|
||||
* Usually, the fipsField value is a unique identifier, but in some
|
||||
* cases there are multiple areas that have the same value. These
|
||||
* areas have different names, so we make that part of the unique
|
||||
* ID.
|
||||
*/
|
||||
String areaID = area.fips + ':' + area.name;
|
||||
if (uniqueAreaIDs.contains(areaID) == false) {
|
||||
uniqueAreaIDs.add(areaID);
|
||||
areas.add(area);
|
||||
}
|
||||
}
|
||||
|
|
71
edexOsgi/build.edex/esb/bin/ndmMenuIngester.sh
Normal file
71
edexOsgi/build.edex/esb/bin/ndmMenuIngester.sh
Normal file
|
@ -0,0 +1,71 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
# This software was developed and / or modified by Raytheon Company,
|
||||
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
#
|
||||
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
# This software product contains export-restricted data whose
|
||||
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
# to non-U.S. persons whether in the United States or abroad requires
|
||||
# an export license or other authorization.
|
||||
#
|
||||
# Contractor Name: Raytheon Company
|
||||
# Contractor Address: 6825 Pine Street, Suite 340
|
||||
# Mail Stop B8
|
||||
# Omaha, NE 68106
|
||||
# 402.291.0100
|
||||
#
|
||||
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
# further licensing information.
|
||||
##
|
||||
# NDM Menu File Ingester
|
||||
|
||||
if [ "$1" == "-help" ];
|
||||
then
|
||||
echo ""
|
||||
echo "ndmMenuIngester.sh <ndmFileDirectory> <ndmMenuFileName>"
|
||||
echo " ndmFileDirectory is the directory holding the ndm files"
|
||||
echo " ndmMenuFileName is the name of the ndm menu file to convert"
|
||||
echo ""
|
||||
echo " Required files: redbookDataKeys.txt, redbookDepictKeys.txt,"
|
||||
echo " redbookProductButtons.txt, and the menu file to convert"
|
||||
exit;
|
||||
fi
|
||||
if [ ! -d "$1" ];
|
||||
then
|
||||
echo "Directory [$1] does not exist!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ ! -f "$1/$2" ];
|
||||
then
|
||||
echo "File [$2] does not exist!"
|
||||
exit
|
||||
fi
|
||||
SRC_DIR=$1
|
||||
MENU_FILE=$2
|
||||
path_to_script=`readlink -f $0`
|
||||
dir=$(dirname $path_to_script)
|
||||
dir=$(dirname $dir)
|
||||
AWIPS_HOME=$(dirname $dir)
|
||||
|
||||
# Search for jars
|
||||
EDEX_PLUGINS="$AWIPS_HOME/edex/lib/"
|
||||
JARS=$(find $EDEX_PLUGINS -name "*.jar")
|
||||
|
||||
# Add jars to classpath
|
||||
addSep=false
|
||||
for i in $JARS
|
||||
do
|
||||
if [[ "$addSep" == true ]];
|
||||
then
|
||||
LOCAL_CLASSPATH=$LOCAL_CLASSPATH":"$i
|
||||
else
|
||||
LOCAL_CLASSPATH=$i
|
||||
addSep=true
|
||||
fi
|
||||
done
|
||||
|
||||
JAVA_INSTALL=/awips2/java/
|
||||
${JAVA_INSTALL}/bin/java -classpath $LOCAL_CLASSPATH com.raytheon.uf.edex.plugin.redbook.menu.NdmMenuConverter $SRC_DIR $MENU_FILE
|
||||
|
|
@ -144,10 +144,10 @@ public class ClearGfeOrphanedLocks {
|
|||
lockList = (List<Lock>) lockMgr.getAllLocks(siteId);
|
||||
// find orphaned locks and break them
|
||||
breakLocks(clients, lockList, lockMgr, siteId);
|
||||
return;
|
||||
} catch (GfeException e) {
|
||||
statusHandler.error("Error retrieving all locks", e);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Version 2015.1.6-0
|
||||
# Version 2015.2.12-1
|
||||
|
||||
import GenericHazards
|
||||
import string, time, os, re, types, copy, LogStream, collections
|
||||
|
@ -9,7 +9,6 @@ import numpy
|
|||
import LocalizationSupport
|
||||
|
||||
from AbsTime import *
|
||||
from StartupDialog import IFPDialog as Dialog
|
||||
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData, ReferenceID
|
||||
from com.raytheon.uf.common.dataplugin.gfe.grid import Grid2DBit as JavaGrid2DBit
|
||||
AWIPS_ENVIRON = "AWIPS2"
|
||||
|
@ -100,7 +99,6 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
"_getLowestThreat": 0,
|
||||
"_setHazardImpactCategories": 0,
|
||||
"_createWholeDomainEditArea": 0,
|
||||
"_groupSegments": 0,
|
||||
"_determineHazards": 0,
|
||||
"_formatLocalTime": 0,
|
||||
"_getTimeZoneList": 0,
|
||||
|
@ -129,13 +127,13 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
"_productHeader": 0,
|
||||
"_ugcHeader": 0,
|
||||
"_processProductParts": 0,
|
||||
"_formatUGC_entries": 0,
|
||||
"_getUgcInfo": 0,
|
||||
"_createProductDictionary": 0,
|
||||
"_initializeProductDictionary": 0,
|
||||
"_formatProductDictionary": 0,
|
||||
"_getStatValue": 0,
|
||||
"_allAreas": 0,
|
||||
"_groupSegments": 0,
|
||||
"_getSegmentVTECRecordsTuples": 0,
|
||||
"_computeIntersectAreas": 0,
|
||||
"_initializeHazardsTable": 0,
|
||||
"_getHazardsTable": 0,
|
||||
|
@ -223,7 +221,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
}
|
||||
|
||||
# Definition["debug"] = 1 # turn on ALL debug messages
|
||||
# Definition["debug"] = 0 # turn off ALL debug messages
|
||||
Definition["debug"] = 0 # turn off ALL debug messages
|
||||
|
||||
def __init__(self):
|
||||
HLSTCV_Common.TextProduct.__init__(self)
|
||||
|
@ -429,13 +427,16 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
if error is not None:
|
||||
return error
|
||||
|
||||
if self._stormName is None or self._stormName.strip() == "":
|
||||
if self._stormName is None or self._stormName == "":
|
||||
return "Could not determine the storm name"
|
||||
|
||||
self._loadLastTwoAdvisories()
|
||||
if self._previousAdvisory is None and self._ImpactsAnticipated:
|
||||
return "A TCV must be transmitted before an HLS can be run"
|
||||
|
||||
if len(self._IncludedImpacts) == 0:
|
||||
return "At least one potential impact section needs to be included."
|
||||
|
||||
# Determine time ranges
|
||||
self._determineTimeRanges(argDict)
|
||||
|
||||
|
@ -452,7 +453,9 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
self._setHazardImpactCategories(threatName)
|
||||
|
||||
# Create the product dictionary and format it to create the output
|
||||
productDict = self._createProductDictionary(self._allAreas())
|
||||
productDict = self._createProductDictionary(self._productParts_HLS,
|
||||
self._allAreas(),
|
||||
areProductPartsSegmented=False)
|
||||
productOutput = self._formatProductDictionary(LegacyFormatter, productDict)
|
||||
|
||||
return productOutput
|
||||
|
@ -493,6 +496,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
statsDict['impactMin'] = None
|
||||
statsDict['impactMax'] = None
|
||||
statsDict['impactRange'] = None
|
||||
statsDict['impactRangeMax'] = None
|
||||
|
||||
self._samplingDict['WindThreat'] = copy.copy(statsDict)
|
||||
self._samplingDict['StormSurgeThreat'] = copy.copy(statsDict)
|
||||
|
@ -553,35 +557,63 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
sectionDict['impactRange'] = ""
|
||||
sectionDict['impactLib'] = []
|
||||
sectionDict['additionalImpactRange'] = []
|
||||
sectionDict['variedImpacts'] = False
|
||||
|
||||
impactMin = self._samplingDict['WindThreat']['impactMin']
|
||||
impactMax = self._samplingDict['WindThreat']['impactMax']
|
||||
impactRange = self._samplingDict['WindThreat']['impactRange']
|
||||
impactRangeMax = self._samplingDict['WindThreat']['impactRangeMax']
|
||||
inputThreatDominant = self._samplingDict['WindThreat']['inputThreatDominant']
|
||||
|
||||
# Test the simplest case first
|
||||
if impactMin == "none" and impactMax == "none":
|
||||
sectionDict['impactRange'] = impactRange
|
||||
sectionDict['variedImpacts'] = None
|
||||
productDict['windSection'] = sectionDict
|
||||
return
|
||||
|
||||
qualifier = self._getImpactsQualifier(impactMax)
|
||||
|
||||
# If there is only one impact across the entire CWA, and it is the max
|
||||
if impactMax != "none" and impactMin == impactMax and inputThreatDominant != "None":
|
||||
sectionDict['impactRange'] = "Prepare for " + impactMax + " damage across " + self._cwa_descriptor() + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for " + qualifier + "wind having possible " + impactMax + " impacts across " + self._cwa_descriptor() + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against " + qualifier + "wind having possible " + impactMax + " impacts across " + self._cwa_descriptor() + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from the main wind event are now unfolding across " + self._cwa_descriptor() + ". Remain well sheltered from " + qualifier + "wind having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
sectionDict['impactRange'] = "Little to no additional wind impacts expected."
|
||||
# Handle the case where the impacts are not the same across the entire CWA
|
||||
else:
|
||||
sectionDict['variedImpacts'] = True
|
||||
sectionDict['impactRange'] = "Prepare for " + impactMax + " damage " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for " + qualifier + "wind having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts in this area include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against " + qualifier + "wind having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts in this area include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from the main wind event are now unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well sheltered from " + qualifier + "wind having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
sectionDict['impactRange'] = "Little to no additional wind impacts expected."
|
||||
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Wind", self._impactCategoryToThreatLevel(impactMax))
|
||||
if self._GeneralOnsetTime != "recovery":
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Wind", self._impactCategoryToThreatLevel(impactMax))
|
||||
else:
|
||||
sectionDict['impactLib'] = ["Community officials are now assessing the extent of actual wind impacts accordingly.",
|
||||
"Emergency response teams are attending to casualty situations as needed.",
|
||||
"Emergency work crews are restoring essential community infrastructure as necessary.",
|
||||
"If you have an emergency dial 9 1 1.",
|
||||
]
|
||||
|
||||
# If there are additional areas
|
||||
if impactRange != impactMax:
|
||||
qualifier = self._getImpactsQualifier(impactRangeMax)
|
||||
|
||||
curPhrase = "Prepare for %s damage across %s." % \
|
||||
(impactRange, self._frame("ENTER AREA DESCRIPTION"))
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
curPhrase = "Also, prepare for " + qualifier + "wind having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
curPhrase = "Also, protect against " + qualifier + "wind having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
curPhrase = "Potential impacts from the main wind event are also now unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well sheltered from " + qualifier + "wind having " + self._frame("possible | additional") + " " + impactRange + " impacts."
|
||||
else:
|
||||
curPhrase = "Little to no additional wind impacts expected."
|
||||
|
||||
# If this phrase is not already part of the additional impacts
|
||||
if curPhrase not in sectionDict['additionalImpactRange']:
|
||||
|
@ -614,12 +646,12 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
impactMin = self._samplingDict['StormSurgeThreat']['impactMin']
|
||||
impactMax = self._samplingDict['StormSurgeThreat']['impactMax']
|
||||
impactRange = self._samplingDict['StormSurgeThreat']['impactRange']
|
||||
impactRangeMax = self._samplingDict['StormSurgeThreat']['impactRangeMax']
|
||||
inputThreatDominant = self._samplingDict['StormSurgeThreat']['inputThreatDominant']
|
||||
|
||||
# Test the simplest case first
|
||||
if impactMin == "none" and impactMax == "none":
|
||||
sectionDict['impactRange'] = impactRange
|
||||
sectionDict['variedImpacts'] = None
|
||||
productDict['surgeSection'] = sectionDict
|
||||
return
|
||||
|
||||
|
@ -628,14 +660,27 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
lifeThreatening = ""
|
||||
|
||||
if impactMax in ["significant", "extensive", "devastating", "catastrophic"]:
|
||||
lifeThreatening = "life-threatening storm surge and "
|
||||
lifeThreatening = "life-threatening "
|
||||
elif impactMax == "limited":
|
||||
lifeThreatening = "locally hazardous "
|
||||
|
||||
sectionDict['impactRange'] = "Prepare for " + \
|
||||
lifeThreatening + impactMax + \
|
||||
" damage in surge prone areas of " + self._cwa_descriptor() + ", with the greatest impacts " + \
|
||||
self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for " + lifeThreatening + "surge having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts in this area include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against " + lifeThreatening + "surge having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts in this area include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from the main surge event are now unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well away from " + lifeThreatening + "surge having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
sectionDict['impactRange'] = "Little to no additional surge impacts expected."
|
||||
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Storm Surge", self._impactCategoryToThreatLevel(impactMax))
|
||||
if self._GeneralOnsetTime != "recovery":
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Storm Surge", self._impactCategoryToThreatLevel(impactMax))
|
||||
else:
|
||||
sectionDict['impactLib'] = ["Community officials are now assessing the extent of actual surge impacts accordingly.",
|
||||
"Emergency response teams are attending to casualty situations as needed.",
|
||||
"Emergency work crews are restoring essential community infrastructure as necessary.",
|
||||
"If you have an emergency dial 9 1 1.",
|
||||
]
|
||||
|
||||
# Reexamine the impact range - we need to separate out "life-threatening" surge categories into a separate statement
|
||||
impactParts = impactRange.split(" ")
|
||||
|
@ -649,9 +694,11 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
if impactParts[0] in ["limited", "none"]:
|
||||
# Make a new range to report
|
||||
impactRange = "significant"
|
||||
impactRangeMax = impactRange
|
||||
|
||||
if impactParts[2] != "significant":
|
||||
impactRange += " to " + impactParts[2]
|
||||
impactRangeMax = impactParts[2]
|
||||
|
||||
impactRangeRest = impactParts[0]
|
||||
|
||||
|
@ -665,8 +712,21 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
# If there are additional life-threatening surge areas
|
||||
if impactRange != impactMax and impactRange != impactMin:
|
||||
|
||||
curPhrase = "Brace for %s%s damage across %s." % \
|
||||
(lifeThreatening, impactRange, self._frame("ENTER AREA DESCRIPTION"))
|
||||
lifeThreatening = ""
|
||||
|
||||
if impactRangeMax in ["significant", "extensive", "devastating", "catastrophic"]:
|
||||
lifeThreatening = "life-threatening "
|
||||
elif impactRangeMax == "limited":
|
||||
lifeThreatening = "locally hazardous "
|
||||
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
curPhrase = "Also, prepare for " + lifeThreatening + "surge having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
curPhrase = "Also, protect against " + lifeThreatening + "surge having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
curPhrase = "Potential impacts from the main surge event are also now unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well away from " + lifeThreatening + "surge having " + self._frame("possible | additional") + " " + impactRange + " impacts."
|
||||
else:
|
||||
curPhrase = "Little to no additional surge impacts expected."
|
||||
|
||||
self.debug_print("DEBUG: curPhrase = '%s'" % (curPhrase), 1)
|
||||
self.debug_print("DEBUG: sectionDict['additionalImpactRange'] = \n'%s'" %
|
||||
|
@ -680,8 +740,16 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
# If there are additional areas
|
||||
if impactRangeRest != impactMax:
|
||||
|
||||
curPhrase = "Prepare for %s damage from storm surge across %s." % \
|
||||
(impactRangeRest, self._frame("ENTER AREA DESCRIPTION"))
|
||||
lifeThreatening = "locally hazardous "
|
||||
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
curPhrase = "Also, prepare for " + lifeThreatening + "surge having possible " + impactRangeRest + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
curPhrase = "Also, protect against " + lifeThreatening + "surge having possible " + impactRangeRest + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
curPhrase = "Potential impacts from the main surge event are also now unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well away from " + lifeThreatening + "surge having " + self._frame("possible | additional") + " " + impactRangeRest + " impacts."
|
||||
else:
|
||||
curPhrase = "Little to no additional surge impacts expected."
|
||||
|
||||
# If this phrase is not already part of the additional impacts
|
||||
if curPhrase not in sectionDict['additionalImpactRange']:
|
||||
|
@ -716,6 +784,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
impactMin = self._samplingDict['FloodingRainThreat']['impactMin']
|
||||
impactMax = self._samplingDict['FloodingRainThreat']['impactMax']
|
||||
impactRange = self._samplingDict['FloodingRainThreat']['impactRange']
|
||||
impactRangeMax = self._samplingDict['FloodingRainThreat']['impactRangeMax']
|
||||
inputThreatDominant = self._samplingDict['FloodingRainThreat']['inputThreatDominant']
|
||||
|
||||
self.debug_print("In _floodingRainSection", 1)
|
||||
|
@ -724,25 +793,68 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
# Test the simplest case first
|
||||
if impactMin == "none" and impactMax == "none":
|
||||
sectionDict['impactRange'] = impactRange
|
||||
sectionDict['variedImpacts'] = None
|
||||
productDict['floodingRainSection'] = sectionDict
|
||||
return
|
||||
|
||||
qualifier = ""
|
||||
if impactMax in ["extensive", "devastating", "catastrophic"]:
|
||||
qualifier = "life-threatening "
|
||||
elif impactMax == "significant":
|
||||
qualifier = "dangerous "
|
||||
elif impactMax == "limited":
|
||||
qualifier = "locally hazardous "
|
||||
|
||||
# If there is only one impact across the entire CWA, and it is the max
|
||||
if impactMax != "none" and impactMin == impactMax and inputThreatDominant != "None":
|
||||
sectionDict['impactRange'] = "Prepare for " + impactMax + " flooding across " + self._cwa_descriptor() + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for " + qualifier + "rainfall flooding having possible " + impactMax + " impacts across " + self._cwa_descriptor() + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against " + qualifier + "rainfall flooding having possible " + impactMax + " impacts across " + self._cwa_descriptor() + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from the flooding rain are still unfolding across " + self._cwa_descriptor() + ". Remain well guarded against " + qualifier + "flood waters having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
sectionDict['impactRange'] = "Additional impacts from flooding rain are still a concern across " + self._cwa_descriptor() + ". Remain well guarded against " + qualifier + "flood waters having further impacts of " + impactMax + " potential."
|
||||
# Handle the case where the impacts are not the same across the entire CWA
|
||||
else:
|
||||
sectionDict['variedImpacts'] = True
|
||||
sectionDict['impactRange'] = "Prepare for " + impactMax + " flooding " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for " + qualifier + "rainfall flooding having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against " + qualifier + "rainfall flooding having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from the flooding rain are still unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well guarded against " + qualifier + "flood waters having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
if impactMax != "none":
|
||||
sectionDict['impactRange'] = "Additional impacts from flooding rain are still a concern across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well guarded against " + qualifier + "flood waters having further impacts of " + impactMax + " potential."
|
||||
else:
|
||||
sectionDict['impactRange'] = "Little to no additional impacts expected from flooding rain."
|
||||
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Flooding Rain", self._impactCategoryToThreatLevel(impactMax))
|
||||
if self._GeneralOnsetTime != "recovery":
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Flooding Rain", self._impactCategoryToThreatLevel(impactMax))
|
||||
else:
|
||||
sectionDict['impactLib'] = []
|
||||
|
||||
# If there are additional areas
|
||||
if impactRange != impactMax:
|
||||
|
||||
curPhrase = "Prepare for %s flooding impacts across %s." % \
|
||||
(impactRange, self._frame("ENTER AREA DESCRIPTION"))
|
||||
qualifier = ""
|
||||
if impactRangeMax in ["extensive", "devastating", "catastrophic"]:
|
||||
qualifier = "life-threatening "
|
||||
elif impactRangeMax == "significant":
|
||||
qualifier = "dangerous "
|
||||
elif impactRangeMax == "limited":
|
||||
qualifier = "locally hazardous "
|
||||
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
curPhrase = "Prepare for " + qualifier + "rainfall flooding having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
curPhrase = "Protect against " + qualifier + "rainfall flooding having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
curPhrase = "Potential impacts from the flooding rain are still unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well guarded against " + qualifier + "flood waters having " + self._frame("possible | additional") + " " + impactRange + " impacts."
|
||||
else:
|
||||
if impactMax != "none":
|
||||
curPhrase = "Additional impacts from flooding rain are still a concern across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well guarded against " + qualifier + "flood waters having further impacts of " + impactRange + " potential."
|
||||
else:
|
||||
curPhrase = "Little to no additional impacts expected from flooding rain."
|
||||
|
||||
# If this phrase is not already part of the additional impacts
|
||||
if curPhrase not in sectionDict['additionalImpactRange']:
|
||||
|
@ -775,12 +887,12 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
impactMin = self._samplingDict['TornadoThreat']['impactMin']
|
||||
impactMax = self._samplingDict['TornadoThreat']['impactMax']
|
||||
impactRange = self._samplingDict['TornadoThreat']['impactRange']
|
||||
impactRangeMax = self._samplingDict['TornadoThreat']['impactRangeMax']
|
||||
inputThreatDominant = self._samplingDict['TornadoThreat']['inputThreatDominant']
|
||||
|
||||
# Test the simplest case first
|
||||
if impactMin == "none" and impactMax == "none":
|
||||
sectionDict['impactRange'] = impactRange
|
||||
sectionDict['variedImpacts'] = None
|
||||
productDict['tornadoSection'] = sectionDict
|
||||
return
|
||||
|
||||
|
@ -791,6 +903,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
impactMin = "devastating"
|
||||
if impactRange in ["devastating", "catastrophic"]:
|
||||
impactRange = "devastating"
|
||||
impactRangeMax = impactRange
|
||||
|
||||
# If the max impact category is "catastrophic", and we lumped "devastating" in with it, ensure "devastating" is not
|
||||
# leftover as the high end of the range
|
||||
|
@ -802,25 +915,67 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
if impactParts[0] != "extensive":
|
||||
# Force the upper end to be 1 category lower
|
||||
impactRange.replace("devastating", "extensive")
|
||||
impactRangeMax = "extensive"
|
||||
# Otherwise, the impact is just "extensive"
|
||||
else:
|
||||
impactRange = "extensive"
|
||||
impactRangeMax = "extensive"
|
||||
|
||||
qualifier = ""
|
||||
if impactMax in ["extensive", "devastating"]:
|
||||
qualifier = "particularly dangerous "
|
||||
elif impactMax == "significant":
|
||||
qualifier = "dangerous "
|
||||
|
||||
# If there is only one impact across the entire CWA, and it is the max
|
||||
if impactMax != "none" and impactMin == impactMax and inputThreatDominant != "None":
|
||||
sectionDict['impactRange'] = "Prepare for " + impactMax + " damage across " + self._cwa_descriptor() + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for a " + qualifier + "tornado event having possible " + impactMax + " impacts across " + self._cwa_descriptor() + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against a " + qualifier + "tornado event having possible " + impactMax + " impacts across " + self._cwa_descriptor() + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from tornadoes are still unfolding across " + self._cwa_descriptor() + ". Remain well braced against a " + qualifier + "tornado event having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
sectionDict['impactRange'] = "Additional impacts from tornadoes are still a concern across " + self._cwa_descriptor() + ". Remain well braced against " + qualifier + "tornado event having further " + impactMax + " impact potential."
|
||||
# Handle the case where the impacts are not the same across the entire CWA
|
||||
else:
|
||||
sectionDict['variedImpacts'] = True
|
||||
sectionDict['impactRange'] = "Prepare for " + impactMax + " damage " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
sectionDict['impactRange'] = "Prepare for a " + qualifier + "tornado event having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
sectionDict['impactRange'] = "Protect against a " + qualifier + "tornado event having possible " + impactMax + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + ". Potential impacts include:"
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
sectionDict['impactRange'] = "Potential impacts from tornadoes are still unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well braced against a " + qualifier + "tornado event having " + self._frame("possible | additional") + " " + impactMax + " impacts. If realized, these impacts include:"
|
||||
else:
|
||||
if impactMax != "none":
|
||||
sectionDict['impactRange'] = "Additional impacts from tornadoes are still a concern across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well braced against " + qualifier + "tornado event having further " + impactMax + " impact potential."
|
||||
else:
|
||||
sectionDict['impactRange'] = "Little to no additional impacts expected from tornadoes."
|
||||
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Tornado", self._impactCategoryToThreatLevel(impactMax))
|
||||
if self._GeneralOnsetTime != "recovery":
|
||||
sectionDict['impactLib'] = self._getPotentialImpactsStatements("Tornado", self._impactCategoryToThreatLevel(impactMax))
|
||||
else:
|
||||
sectionDict['impactLib'] = []
|
||||
|
||||
# If there are additional areas
|
||||
if impactRange != impactMax:
|
||||
|
||||
curPhrase = "Prepare for %s damage across %s." % \
|
||||
(impactRange, self._frame("ENTER AREA DESCRIPTION"))
|
||||
qualifier = ""
|
||||
if impactRangeMax in ["extensive", "devastating"]:
|
||||
qualifier = "particularly dangerous "
|
||||
elif impactRangeMax == "significant":
|
||||
qualifier = "dangerous "
|
||||
|
||||
if self._GeneralOnsetTime == "check plans":
|
||||
curPhrase = "Prepare for a " + qualifier + "tornado event having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "complete preparations":
|
||||
curPhrase = "Protect against a " + qualifier + "tornado event having possible " + impactRange + " impacts across " + self._frame("ENTER AREA DESCRIPTION") + "."
|
||||
elif self._GeneralOnsetTime == "hunker down":
|
||||
curPhrase = "Potential impacts from tornadoes are still unfolding across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well braced against a " + qualifier + "tornado event having " + self._frame("possible | additional") + " " + impactRange + " impacts."
|
||||
else:
|
||||
if impactMax != "none":
|
||||
curPhrase = "Additional impacts from tornadoes are still a concern across " + self._frame("ENTER AREA DESCRIPTION") + ". Remain well braced against " + qualifier + "tornado event having further " + impactRange + " impact potential."
|
||||
else:
|
||||
curPhrase = "Little to no additional impacts expected from tornadoes."
|
||||
|
||||
# If this phrase is not already part of the additional impacts
|
||||
if curPhrase not in sectionDict['additionalImpactRange']:
|
||||
|
@ -842,6 +997,17 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
|
||||
productDict['tornadoSection'] = sectionDict
|
||||
|
||||
def _getImpactsQualifier(self, impact):
|
||||
qualifier = ""
|
||||
if impact in ["extensive", "devastating", "catastrophic"]:
|
||||
qualifier = "life-threatening "
|
||||
elif impact == "significant":
|
||||
qualifier = "dangerous "
|
||||
elif impact == "limited":
|
||||
qualifier = "hazardous "
|
||||
|
||||
return qualifier
|
||||
|
||||
def _coastalHazardsSection(self, productDict, productSegmentGroup, productSegment):
|
||||
productDict['coastalHazardsSection'] = self._frame("ENTER HERE A STATEMENT OF ANY ADDITIONAL HAZARDS OF CONCERN ALONG THE COAST SUCH AS RIP CURRENTS, HIGH WAVES, CONCERNS FOR BEACH EROSION ETC ETC IF NOT ALREADY DONE IN THE SURGE SECTION.")
|
||||
|
||||
|
@ -1199,7 +1365,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
|
||||
# Determine dominant impact category for rest of CWA - No impact
|
||||
if impactMin == "none" and impactMax == "none":
|
||||
impactRange = "No impacts are anticipated at this time across " + self._cwa_descriptor() + "."
|
||||
impactRange = "Little to no " + self._frame("additional") + " impacts are anticipated at this time across " + self._cwa_descriptor() + "."
|
||||
# Otherwise, at least some impact will be experienced across the CWA
|
||||
else:
|
||||
# Do not permit the lowest category to be "None", if the highest category is also not "None"
|
||||
|
@ -1210,6 +1376,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
|
||||
if impactMin == impactMax:
|
||||
impactRange = impactMax
|
||||
impactRangeMax = impactMax
|
||||
elif impactMin == impactRangeMax:
|
||||
impactRange = impactRangeMax
|
||||
else:
|
||||
|
@ -1218,6 +1385,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
self._samplingDict[threatName]['impactMin'] = impactMin
|
||||
self._samplingDict[threatName]['impactMax'] = impactMax
|
||||
self._samplingDict[threatName]['impactRange'] = impactRange
|
||||
self._samplingDict[threatName]['impactRangeMax'] = impactRangeMax
|
||||
|
||||
###############################################################
|
||||
### Area, Zone and Segment related methods
|
||||
|
@ -1234,30 +1402,6 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
refData = ReferenceData(gridLoc, refID, grid2Dbit)
|
||||
editAreaUtils.saveEditAreas([refData])
|
||||
|
||||
def _groupSegments(self, segments):
|
||||
'''
|
||||
Group the segments into the products
|
||||
return a list of productSegmentGroup dictionaries
|
||||
'''
|
||||
|
||||
segment_vtecRecords_tuples = []
|
||||
for segment in segments:
|
||||
vtecRecords = self._getVtecRecords(segment)
|
||||
self.debug_print("vtecRecords =\n\n%s\n" % (self._pp.pformat(vtecRecords)))
|
||||
segment_vtecRecords_tuples.append((segment, vtecRecords))
|
||||
|
||||
productSegmentGroup = {
|
||||
'productID' : 'HLS',
|
||||
'productName': self._productName,
|
||||
'geoType': 'area',
|
||||
'vtecEngine': self._hazardsTable,
|
||||
'mapType': 'publicZones',
|
||||
'segmented': True,
|
||||
'productParts': self._productParts_HLS(segment_vtecRecords_tuples),
|
||||
}
|
||||
|
||||
return productSegmentGroup
|
||||
|
||||
###############################################################
|
||||
### Hazards related methods
|
||||
|
||||
|
@ -1393,7 +1537,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
|
|||
headlineSearch[0] = re.sub("\.\.\.$", "", headlineSearch[0])
|
||||
|
||||
# # Remove the first and last '**' - if they exist
|
||||
# headlineSearch[0] = headlineSearch[0].sub("**", "").strip()
|
||||
headlineSearch[0] = headlineSearch[0].replace("**", "").strip()
|
||||
|
||||
# Return the first cleaned-up headline string we found
|
||||
return self._cleanText(headlineSearch[0])
|
||||
|
@ -2321,7 +2465,7 @@ class LegacyFormatter():
|
|||
elif name == "situationOverview":
|
||||
text += self.processSituationOverview(productDict['situationOverview'])
|
||||
elif name == "sigPotentialImpacts":
|
||||
header = "Significant Potential Impacts"
|
||||
header = "Potential Impacts"
|
||||
text += header + "\n" + "-"*len(header) + "\n\n"
|
||||
if not self._textProduct._ImpactsAnticipated:
|
||||
text += "None\n\n"
|
||||
|
@ -2517,20 +2661,20 @@ class LegacyFormatter():
|
|||
text = "* " + sectionDict['title'] + ":\n"
|
||||
|
||||
impactRangeText = sectionDict['impactRange']
|
||||
if sectionDict['variedImpacts'] is not None:
|
||||
if sectionDict['variedImpacts']:
|
||||
impactRangeText += " In these areas, potential impacts include:"
|
||||
else:
|
||||
impactRangeText += " Potential impacts include:"
|
||||
|
||||
text += self._textProduct.indentText(impactRangeText, maxWidth=self._textProduct._lineLength)
|
||||
|
||||
if self._textProduct._GeneralOnsetTime == "recovery" and len(sectionDict['impactLib']) != 0:
|
||||
text += "|*\n"
|
||||
|
||||
for impact in sectionDict['impactLib']:
|
||||
text += self._textProduct.indentText(impact,
|
||||
indentFirstString = self.TAB + "- ",
|
||||
indentNextString = self.TAB + " ",
|
||||
maxWidth=self._textProduct._lineLength)
|
||||
|
||||
if self._textProduct._GeneralOnsetTime == "recovery" and len(sectionDict['impactLib']) != 0:
|
||||
text += "*|\n"
|
||||
|
||||
if len(sectionDict['additionalImpactRange']) != 0:
|
||||
text += "\n"
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -12,7 +12,7 @@
|
|||
|
||||
<!-- SUBCENTER 0 -->
|
||||
<model>
|
||||
<name>MRMS</name>
|
||||
<name>MRMS_1000</name>
|
||||
<center>161</center>
|
||||
<subcenter>0</subcenter>
|
||||
<grid>10000</grid>
|
||||
|
@ -22,7 +22,7 @@
|
|||
</model>
|
||||
|
||||
<model>
|
||||
<name>MRMS</name>
|
||||
<name>MRMS_0500</name>
|
||||
<center>161</center>
|
||||
<subcenter>0</subcenter>
|
||||
<grid>10001</grid>
|
||||
|
@ -58,4 +58,4 @@
|
|||
|
||||
<!-- END SUBCENTER 1 -->
|
||||
|
||||
</gribModelSet>
|
||||
</gribModelSet>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
</model>
|
||||
|
||||
<model>
|
||||
<name>MPE-Local</name>
|
||||
<name>MPE-Mosaic</name>
|
||||
<center>9</center>
|
||||
<subcenter>0</subcenter>
|
||||
<grid>304</grid>
|
||||
|
@ -50,7 +50,6 @@
|
|||
</process>
|
||||
</model>
|
||||
|
||||
|
||||
<!-- END SUBCENTER 0 -->
|
||||
|
||||
<!-- SUBCENTER 105: San Juan PR WFO -->
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<subGridDef>
|
||||
<modelNames>MRMS</modelNames>
|
||||
<modelNames>MRMS_1000</modelNames>
|
||||
<referenceGrid>10000</referenceGrid>
|
||||
<nx>800</nx>
|
||||
<ny>600</ny>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<subGridDef>
|
||||
<modelNames>MRMS</modelNames>
|
||||
<modelNames>MRMS_0500</modelNames>
|
||||
<referenceGrid>10001</referenceGrid>
|
||||
<nx>1600</nx>
|
||||
<ny>1200</ny>
|
||||
|
|
|
@ -1201,7 +1201,7 @@ C | 1 | 0 | 4 | | |..|8000F0FF| | 0 | 2
|
|||
<parameter>PLI</parameter>
|
||||
</paramLevelMatches>
|
||||
<contourStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<contourLabeling labelSpacing="4">
|
||||
<increment>2</increment>
|
||||
</contourLabeling>
|
||||
|
@ -1212,7 +1212,7 @@ C | 1 | 0 | 4 | | |..|8000F0FF| | 0 | 2
|
|||
<parameter>SLI</parameter>
|
||||
</paramLevelMatches>
|
||||
<contourStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<displayFlags>NoPlane</displayFlags>
|
||||
<contourLabeling labelSpacing="4">
|
||||
<increment>2</increment>
|
||||
|
@ -1229,7 +1229,7 @@ C | 1 | 0 | 4 | | |..|8000F0FF|,900| 0 | 2
|
|||
<creatingEntity>Laps</creatingEntity>
|
||||
</paramLevelMatches>
|
||||
<contourStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<displayFlags>NoPlane</displayFlags>
|
||||
<contourLabeling labelSpacing="4">
|
||||
<increment>2</increment>
|
||||
|
@ -1244,7 +1244,7 @@ C | 1 | 0 | 4 | | |..|8000F0FF| | 0 | 2
|
|||
<parameter>BLI</parameter>
|
||||
</paramLevelMatches>
|
||||
<contourStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<contourLabeling labelSpacing="4">
|
||||
<increment>2</increment>
|
||||
</contourLabeling>
|
||||
|
@ -2771,7 +2771,7 @@ C | 1 | 0 | 4 | | |..|8000F0FF|,,,80 | 0 | 2
|
|||
</paramLevelMatches>
|
||||
<contourStyle>
|
||||
<smoothingDistance>80</smoothingDistance>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<displayFlags>NoPlane</displayFlags>
|
||||
<contourLabeling labelSpacing="4">
|
||||
<increment>2</increment>
|
||||
|
|
|
@ -347,7 +347,7 @@
|
|||
<parameter>shWlt</parameter>
|
||||
</paramLevelMatches>
|
||||
<graphStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
</graphStyle>
|
||||
</styleRule>
|
||||
|
||||
|
|
|
@ -1780,7 +1780,7 @@
|
|||
<parameter>PLI</parameter>
|
||||
</paramLevelMatches>
|
||||
<imageStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<range scale="LINEAR">
|
||||
<minValue>-15</minValue>
|
||||
<maxValue>15</maxValue>
|
||||
|
@ -1800,7 +1800,7 @@
|
|||
<parameter>BLI</parameter>
|
||||
</paramLevelMatches>
|
||||
<imageStyle>
|
||||
<displayUnits label="C">K</displayUnits>
|
||||
<displayUnits>C</displayUnits>
|
||||
<range scale="LINEAR">
|
||||
<minValue>-15</minValue>
|
||||
<maxValue>15</maxValue>
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
## EVAN BOOKBINDER -- SEP 18 2013 Implemented config.vm
|
||||
## PHIL KURIMSKI -- JUN 26 2014 OB14.2.2-9 ##
|
||||
## ADDED DSS EVENTS ##
|
||||
## UPDATED PHIL KURIMSKI -- FEB 18 2015 Implemented##
|
||||
## updated CTAs ##
|
||||
#####################################################
|
||||
#parse("config.vm")
|
||||
################################################
|
||||
|
@ -335,7 +337,7 @@ THIS IS A TEST MESSAGE. ##
|
|||
THIS IS A TEST MESSAGE. ##
|
||||
#end
|
||||
#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})
|
||||
...${report}LOCATED ##
|
||||
...${report}WAS LOCATED ##
|
||||
#if(${stormType} == "line")
|
||||
#handleClosestPoints(${list}, ${closestPoints}, ${otherClosestPoints}, ${stormType}, ${nearPhrase} , ${maxMarineNearDistance}, ${overPhrase}, ${maxMarineOverDistance}, ${marineDistanceUnits}, ${useSecondReferenceLine})
|
||||
#else
|
||||
|
@ -406,7 +408,7 @@ THOSE ATTENDING !**event/venue name or location**! ARE IN THE PATH OF ${specialE
|
|||
|
||||
## Comment out #parse command below to pull in Dynamic DSS Event Info
|
||||
## If this feature is utilized, the "specialEvent" bullet (output above) can
|
||||
## likely be commented out from the impactSevereThunderstormWarning.xml file
|
||||
## likely be commented out from the impactSpecialMarineWarning.xml file
|
||||
#parse("dssEvents.vm")
|
||||
|
||||
#####################
|
||||
|
@ -430,46 +432,46 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS...
|
|||
${ashfallCTA}
|
||||
|
||||
#if(${list.contains(${bullets}, "genericCTA")})
|
||||
#if(${stormType} == "line")
|
||||
AS THUNDERSTORMS MOVE OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES.
|
||||
|
||||
#else
|
||||
AS THIS THUNDERSTORM MOVES OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THE STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "gustyWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "hailWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THESE STORMS.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THIS STORM.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "nonThunderstormCTA")})
|
||||
MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES. BOATERS...ESPECIALLY THOSE UNDER SAIL...SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THE HIGH WINDS SUBSIDE.
|
||||
SEEK SAFE SHELTER...MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES.
|
||||
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "waterspoutCTA")})
|
||||
#if(${list.contains(${bullets}, "thunderstorm")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#else
|
||||
WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "lightningCTA")})
|
||||
#if(${stormType} == "line")
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THESE STORMS. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#else
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "reportCTA")})
|
||||
REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
|
||||
#end
|
||||
#if(${ctaSelected} == "YES")
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
Note: Volcano information will not show up in the GUI unless uncommented out
|
||||
Phil Kurimski 09-19-2013 added geospatialConfig.xml
|
||||
Phil Kurimski 06-26-2014 added DSS Events
|
||||
Phil Kurimski 02-18-2015 Updated CTA section
|
||||
-->
|
||||
|
||||
<!-- INCLUDE ALL GEOSPTATIAL INFORMATION FOR THIS PRODUCT
|
||||
|
@ -137,13 +138,13 @@ turned on unless the corresponding .vm file is turned on in a given template's .
|
|||
<bullet bulletName="specialEvent" bulletText="Special heads-up for large event/venue" parseString="THOSE ATTENDING"/>
|
||||
<bullet bulletText="" bulletType="title"/>
|
||||
<bullet bulletText=" ****** CALLS TO ACTION (CHOOSE 1 OR MORE) ****** " bulletType="title"/>
|
||||
<bullet bulletName="genericCTA" bulletText="As thunderstorms move over the water.." parseString="OVER THE WATER...BOATERS CAN EXPECT"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES..."/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Mariners can expect cta with hail/wind speeds" parseString="MARINERS CAN EXPECT WIND GUSTS"/>
|
||||
<bullet bulletName="genericCTA" bulletText="Generic CTA" parseString="MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Gusty Winds CTA" parseString="MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED"/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Wind/Hail cta with hail/wind speeds" parseString="DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE"/>
|
||||
<bullet bulletName="nonThunderstormCTA" bulletText="Non thunderstorm winds - mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Thunderstorms can produce waterspouts" parseString="THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning" parseString="FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Waterspout CTA" parseString="CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning CTA" parseString="FREQUENT LIGHTNING IS OCCURRING WITH"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE"/>
|
||||
</bullets>
|
||||
</bulletActionGroup>
|
||||
<bulletActionGroup action="COR" phen="MA" sig="W">
|
||||
|
@ -196,13 +197,13 @@ turned on unless the corresponding .vm file is turned on in a given template's .
|
|||
<bullet bulletName="specialEvent" bulletText="Special heads-up for large event/venue" parseString="THOSE ATTENDING"/>
|
||||
<bullet bulletText="" bulletType="title"/>
|
||||
<bullet bulletText=" ****** CALLS TO ACTION (CHOOSE 1 OR MORE) ****** " bulletType="title"/>
|
||||
<bullet bulletName="genericCTA" bulletText="As thunderstorms move over the water.." parseString="OVER THE WATER...BOATERS CAN EXPECT"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES..."/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Mariners can expect cta with hail/wind speeds" parseString="MARINERS CAN EXPECT WIND GUSTS"/>
|
||||
<bullet bulletName="genericCTA" bulletText="Generic CTA" parseString="MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Gusty Winds CTA" parseString="MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED"/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Wind/Hail cta with hail/wind speeds" parseString="DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE"/>
|
||||
<bullet bulletName="nonThunderstormCTA" bulletText="Non thunderstorm winds - mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Thunderstorms can produce waterspouts" parseString="THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning" parseString="FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Waterspout CTA" parseString="CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning CTA" parseString="FREQUENT LIGHTNING IS OCCURRING WITH"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE"/>
|
||||
</bullets>
|
||||
</bulletActionGroup>
|
||||
</bulletActionGroups>
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
## UPDATED BOOKBINDER 9-18-2013 Implemented config.vm
|
||||
## PHIL KURIMSKI -- JUN 26 2014 OB14.2.2-9 ##
|
||||
## ADDED DSS EVENTS ##
|
||||
## UPDATED PHIL KURIMSKI -- FEB 18 2015 Implemented##
|
||||
## updated CTAs ##
|
||||
## MIKE REGA - 2-26-2015 removed wind/hail/spout ##
|
||||
## tags in CAN and EXP ##
|
||||
#####################################################
|
||||
#parse("config.vm")
|
||||
############################################
|
||||
|
@ -447,7 +451,7 @@ ${area.name}...
|
|||
THIS IS A TEST MESSAGE. ##
|
||||
#end
|
||||
#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})
|
||||
...${report}LOCATED ##
|
||||
...${report}WAS LOCATED ##
|
||||
#if(${stormType} == "line")
|
||||
#handleClosestPoints(${list}, ${closestPoints}, ${otherClosestPoints}, ${stormType}, ${nearPhrase} , ${maxMarineNearDistance}, ${overPhrase}, ${maxMarineOverDistance}, ${marineDistanceUnits}, ${useSecondReferenceLine})
|
||||
#else
|
||||
|
@ -507,7 +511,7 @@ THOSE ATTENDING !**event/venue name or location**! ARE IN THE PATH OF ${specialE
|
|||
|
||||
## Comment out #parse command below to pull in Dynamic DSS Event Info
|
||||
## If this feature is utilized, the "specialEvent" bullet (output above) can
|
||||
## likely be commented out from the impactSevereThunderstormWarning.xml file
|
||||
## likely be commented out from the impactSpecialMarineWarningFollowup.xml file
|
||||
#parse("dssEvents.vm")
|
||||
|
||||
#####################
|
||||
|
@ -532,46 +536,46 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS...
|
|||
${ashfallCTA}
|
||||
|
||||
#if(${list.contains(${bullets}, "genericCTA")})
|
||||
#if(${stormType} == "line")
|
||||
AS THUNDERSTORMS MOVE OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES.
|
||||
|
||||
#else
|
||||
AS THIS THUNDERSTORM MOVES OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THE STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "gustyWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "hailWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THESE STORMS.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THIS STORM.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "nonThunderstormCTA")})
|
||||
MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES. BOATERS...ESPECIALLY THOSE UNDER SAIL...SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THE HIGH WINDS SUBSIDE.
|
||||
SEEK SAFE SHELTER...MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES.
|
||||
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "waterspoutCTA")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
#if(${list.contains(${bullets}, "thunderstorm")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#else
|
||||
WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "lightningCTA")})
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
#if(${stormType} == "line")
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THESE STORMS. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#else
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "reportCTA")})
|
||||
REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
|
||||
#end
|
||||
#if(${ctaSelected} == "YES")
|
||||
|
@ -756,7 +760,7 @@ ${area.name}...
|
|||
#if(${productClass}=="T")
|
||||
THIS IS A TEST MESSAGE. ##
|
||||
#end
|
||||
AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report}LOCATED ##
|
||||
AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report}WAS LOCATED ##
|
||||
#if(${stormType} == "line")
|
||||
#handleClosestPoints(${list}, ${closestPoints}, ${otherClosestPoints}, ${stormType}, ${nearPhrase} , ${maxMarineNearDistance}, ${overPhrase}, ${maxMarineOverDistance}, ${marineDistanceUnits}, ${useSecondReferenceLine})
|
||||
#else
|
||||
|
@ -822,7 +826,7 @@ THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THIS S
|
|||
|
||||
## Comment out #parse command below to pull in Dynamic DSS Event Info
|
||||
## If this feature is utilized, the "specialEvent" bullet (output above) can
|
||||
## likely be commented out from the impactSevereThunderstormWarning.xml file
|
||||
## likely be commented out from the impactSpecialMarineWarningFollowup.xml file
|
||||
#parse("dssEvents.vm")
|
||||
|
||||
#####################
|
||||
|
@ -847,46 +851,46 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS...
|
|||
${ashfallCTA}
|
||||
|
||||
#if(${list.contains(${bullets}, "genericCTA")})
|
||||
#if(${stormType} == "line")
|
||||
AS THUNDERSTORMS MOVE OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES.
|
||||
|
||||
#else
|
||||
AS THIS THUNDERSTORM MOVES OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THE STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "gustyWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "hailWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THESE STORMS.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THIS STORM.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "nonThunderstormCTA")})
|
||||
MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES. BOATERS...ESPECIALLY THOSE UNDER SAIL...SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THE HIGH WINDS SUBSIDE.
|
||||
SEEK SAFE SHELTER...MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES.
|
||||
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "waterspoutCTA")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
#if(${list.contains(${bullets}, "thunderstorm")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#else
|
||||
WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "lightningCTA")})
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
#if(${stormType} == "line")
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THESE STORMS. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#else
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "reportCTA")})
|
||||
REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
|
||||
#end
|
||||
#if(${ctaSelected} == "YES")
|
||||
|
@ -1023,7 +1027,7 @@ ${area.name}...
|
|||
#if(${productClass}=="T")
|
||||
THIS IS A TEST MESSAGE. ##
|
||||
#end
|
||||
AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report}LOCATED ##
|
||||
AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report}WAS LOCATED ##
|
||||
##Many of the variables passed below are controlled by config.vm
|
||||
#if(${stormType} == "line")
|
||||
#handleClosestPoints(${list}, ${closestPoints}, ${otherClosestPoints}, ${stormType}, ${nearPhrase} , ${maxMarineNearDistance}, ${overPhrase}, ${maxMarineOverDistance}, ${marineDistanceUnits}, ${useSecondReferenceLine})
|
||||
|
@ -1090,7 +1094,7 @@ THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THIS S
|
|||
|
||||
## Comment out #parse command below to pull in Dynamic DSS Event Info
|
||||
## If this feature is utilized, the "specialEvent" bullet (output above) can
|
||||
## likely be commented out from the impactSevereThunderstormWarning.xml file
|
||||
## likely be commented out from the impactSpecialMarineWarningFollowup.xml file
|
||||
#parse("dssEvents.vm")
|
||||
|
||||
#####################
|
||||
|
@ -1115,46 +1119,46 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS...
|
|||
${ashfallCTA}
|
||||
|
||||
#if(${list.contains(${bullets}, "genericCTA")})
|
||||
#if(${stormType} == "line")
|
||||
AS THUNDERSTORMS MOVE OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES.
|
||||
|
||||
#else
|
||||
AS THIS THUNDERSTORM MOVES OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THE STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "gustyWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "hailWindsCTA")})
|
||||
#if(${stormType} == "line")
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THESE STORMS.
|
||||
|
||||
#else
|
||||
MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES.
|
||||
BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THIS STORM.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "nonThunderstormCTA")})
|
||||
MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES. BOATERS...ESPECIALLY THOSE UNDER SAIL...SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THE HIGH WINDS SUBSIDE.
|
||||
SEEK SAFE SHELTER...MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES.
|
||||
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "waterspoutCTA")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
#if(${list.contains(${bullets}, "thunderstorm")})
|
||||
THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#else
|
||||
WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "lightningCTA")})
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
#if(${stormType} == "line")
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THESE STORMS. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#else
|
||||
FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS.
|
||||
|
||||
#end
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "reportCTA")})
|
||||
REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE OFFICE.
|
||||
|
||||
#end
|
||||
#if(${ctaSelected} == "YES")
|
||||
|
@ -1266,11 +1270,21 @@ THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE.
|
|||
## Waterspout/Hail/Wind Tags used by CR for IBW
|
||||
##################################################################
|
||||
|
||||
#if(${action}=="CAN" || ${action}=="EXP")
|
||||
#set($windTag = "")
|
||||
#set($hailTag = "")
|
||||
#set($spoutTag = "")
|
||||
#end
|
||||
|
||||
#if($spoutTag.length() > 0)
|
||||
<L>${spoutTag}</L>
|
||||
#end
|
||||
#if($hailTag.length() > 0)
|
||||
<L>HAIL...${hailTag}IN</L>
|
||||
#end
|
||||
#if($windTag.length() > 0)
|
||||
<L>WIND...${windTag}KTS</L>
|
||||
#end
|
||||
|
||||
$$
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
Note: Volcano information will not show up in the GUI unless uncommented out
|
||||
Phil Kurimski 09-19-2013 added geospatialConfig.xml
|
||||
Phil Kurimski 06-26-2014 added DSS Events
|
||||
Phil Kurimski 02-18-2015 Updated CTA section
|
||||
-->
|
||||
|
||||
<!-- INCLUDE ALL GEOSPTATIAL INFORMATION FOR THIS PRODUCT
|
||||
|
@ -184,13 +185,13 @@ turned on unless the corresponding .vm file is turned on in a given template's .
|
|||
<bullet bulletName="specialEvent" bulletText="Special heads-up for large event/venue" parseString="THOSE ATTENDING"/>
|
||||
<bullet bulletText="" bulletType="title"/>
|
||||
<bullet bulletText=" ****** CALLS TO ACTION (CHOOSE 1 OR MORE) ****** " bulletType="title"/>
|
||||
<bullet bulletName="genericCTA" bulletText="As thunderstorms move over the water.." parseString="OVER THE WATER...BOATERS CAN EXPECT"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES..."/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Mariners can expect cta with hail/wind speeds" parseString="MARINERS CAN EXPECT WIND GUSTS"/>
|
||||
<bullet bulletName="genericCTA" bulletText="Generic CTA" parseString="MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Gusty Winds CTA" parseString="MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED"/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Wind/Hail cta with hail/wind speeds" parseString="DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE"/>
|
||||
<bullet bulletName="nonThunderstormCTA" bulletText="Non thunderstorm winds - mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Thunderstorms can produce waterspouts" parseString="THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning" parseString="FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Waterspout CTA" parseString="CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning CTA" parseString="FREQUENT LIGHTNING IS OCCURRING WITH"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE"/>
|
||||
</bullets>
|
||||
</bulletActionGroup>
|
||||
<bulletActionGroup action="COR" phen="MA" sig="W">
|
||||
|
@ -243,13 +244,13 @@ turned on unless the corresponding .vm file is turned on in a given template's .
|
|||
<bullet bulletName="specialEvent" bulletText="Special heads-up for large event/venue" parseString="THOSE ATTENDING"/>
|
||||
<bullet bulletText="" bulletType="title"/>
|
||||
<bullet bulletText=" ****** CALLS TO ACTION (CHOOSE 1 OR MORE) ****** " bulletType="title"/>
|
||||
<bullet bulletName="genericCTA" bulletText="As thunderstorms move over the water.." parseString="OVER THE WATER...BOATERS CAN EXPECT"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES..."/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Mariners can expect cta with hail/wind speeds" parseString="MARINERS CAN EXPECT WIND GUSTS"/>
|
||||
<bullet bulletName="genericCTA" bulletText="Generic CTA" parseString="MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES"/>
|
||||
<bullet bulletName="gustyWindsCTA" bulletText="Gusty Winds CTA" parseString="MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED"/>
|
||||
<bullet bulletName="hailWindsCTA" bulletText="Wind/Hail cta with hail/wind speeds" parseString="DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE"/>
|
||||
<bullet bulletName="nonThunderstormCTA" bulletText="Non thunderstorm winds - mariners can expect gusty winds.." parseString="MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Thunderstorms can produce waterspouts" parseString="THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning" parseString="FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY"/>
|
||||
<bullet bulletName="waterspoutCTA" bulletText="Waterspout CTA" parseString="CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY"/>
|
||||
<bullet bulletName="lightningCTA" bulletText="Frequent lightning CTA" parseString="FREQUENT LIGHTNING IS OCCURRING WITH"/>
|
||||
<bullet bulletName="reportCTA" bulletText="Report severe wx" parseString="REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE"/>
|
||||
</bullets>
|
||||
</bulletActionGroup>
|
||||
</bulletActionGroups>
|
||||
|
|
|
@ -6,8 +6,9 @@
|
|||
## EDITED EVAN BOOKBINDER 2-25-13 FOR IBW 2013 ##
|
||||
## EDITED PHIL KURIMSKI 5-20-13 FOR UPDATED IMPACT STATEMENTS ##
|
||||
## EDITED PHIL KURIMSKI 9-17-13 FOR SMW IMPACT STATEMENTS ##
|
||||
## EDITED EvAN BOOKBINDER 2-18-14 FOR 2014 IMPACT STATEMENTS ##
|
||||
## EDITED EVAN BOOKBINDER 2-18-14 FOR 2014 IMPACT STATEMENTS ##
|
||||
## EDITED PHIL KURIMSKI 6-26-15 FIXED CONSID IMPCT VARIABLE ##
|
||||
## EDITED PHIL KURIMSKI 2-19-15 UPDATED SMW IMPACT STATEMENTS ##
|
||||
################################################################
|
||||
##
|
||||
################################################################
|
||||
|
@ -114,7 +115,63 @@
|
|||
################################################################
|
||||
## Finally create the Impact Statements for the SMW template
|
||||
################################################################
|
||||
#set($smwimpact = "OVERTURNED AND CAPSIZED BOATS.")
|
||||
###################################################
|
||||
## HANDLE HAIL POSSIBILITIES ######################
|
||||
###################################################
|
||||
#set($smwHailImpact = "")
|
||||
#set($hailAppend = "")
|
||||
#if($hailTag == ">.75")
|
||||
#set($smwHailImpact = "LARGE HAIL COULD RESULT IN STRUCTURAL DAMAGE.")
|
||||
#set($hailAppend = " AND HAIL")
|
||||
#end
|
||||
#if($hailTag == ">2.0")
|
||||
#set($smwHailImpact = "LARGE HAIL COULD RESULT IN PERSONAL INJURY AND SIGNIFICANT STRUCTURAL DAMAGE.")
|
||||
#set($hailAppend = " AND HAIL")
|
||||
#end
|
||||
###################################################
|
||||
## HANDLE WIND POSSIBILITIES ######################
|
||||
###################################################
|
||||
#set($smwWindImpact = "")
|
||||
#if(${windTag} == ">34" || ${windTag} == "40" || ${windTag} == "49")
|
||||
#set($smwWindImpact = "SMALL CRAFT COULD BE DAMAGED IN BRIEFLY HIGHER WINDS AND SUDDENLY HIGHER WAVES.")
|
||||
#end
|
||||
## If winds are 50 knots or greater do not include hail impact statement
|
||||
#if(${windTag} == "50" || ${windTag} == "65")
|
||||
#set($smwWindImpact = "BOATS COULD SUFFER SIGNIFICANT STRUCTURAL DAMAGE IN HIGH WINDS${hailAppend}. SMALL CRAFT COULD CAPSIZE IN SUDDENLY HIGHER WAVES.")
|
||||
#set($smwHailImpact = "")
|
||||
#end
|
||||
###################################################
|
||||
## HANDLE WATERSPOUTS #############################
|
||||
###################################################
|
||||
#set($smwWaterspoutImpact = "")
|
||||
#if(${list.contains(${bullets}, "thunderstorm")})
|
||||
#set($extraImpact = "EASILY OVERTURN BOATS AND ")
|
||||
#else
|
||||
#set($extraImpact = "")
|
||||
#end
|
||||
#if(${list.contains(${bullets}, "sightedSpout")} || ${list.contains(${bullets}, "possibleSpout")})
|
||||
#set($smwWaterspoutImpact = "WATERSPOUTS CAN ${extraImpact}CREATE LOCALLY HAZARDOUS SEAS.")
|
||||
#end
|
||||
##########################################################
|
||||
## Merge the Hail...Wind and Waterspout Impact Statements
|
||||
##########################################################
|
||||
#if($smwWindImpact.length() > 0 && $smwHailImpact.length() > 0 && $smwWaterspoutImpact.length() > 0)
|
||||
#set($smwimpact = "${smwWaterspoutImpact} ${smwWindImpact} ${smwHailImpact}")
|
||||
#elseif($smwWindImpact.length() > 0 && $smwHailImpact.length() > 0)
|
||||
#set($smwimpact = "${smwWindImpact} ${smwHailImpact}")
|
||||
#elseif($smwWindImpact.length() > 0 && $smwWaterspoutImpact.length() > 0)
|
||||
#set($smwimpact = "${smwWaterspoutImpact} ${smwWindImpact}")
|
||||
#elseif($smwHailImpact.length() > 0 && $smwWaterspoutImpact.length() > 0)
|
||||
#set($smwimpact = "${smwWaterspoutImpact} ${smwHailImpact}")
|
||||
#elseif($smwWaterspoutImpact.length() > 0)
|
||||
#set($smwimpact = "${smwWaterspoutImpact}")
|
||||
#elseif($smwWindImpact.length() > 0)
|
||||
#set($smwimpact = "${smwWindImpact}")
|
||||
#elseif($smwHailImpact.length() > 0)
|
||||
#set($smwimpact = "${smwHailImpact}")
|
||||
#else
|
||||
#set($smwimpact = "!**YOU DID NOT SELECT ANY THREATS WORTHY OF SMW CRITERIA. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!")
|
||||
#end
|
||||
############################################################################
|
||||
## End of File
|
||||
############################################################################
|
||||
|
|
|
@ -61,6 +61,10 @@ import com.raytheon.uf.common.util.CollectionUtil;
|
|||
import com.raytheon.uf.common.util.FileUtil;
|
||||
import com.raytheon.uf.edex.core.EDEXUtil;
|
||||
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
||||
import com.raytheon.uf.edex.database.cluster.ClusterLockUtils;
|
||||
import com.raytheon.uf.edex.database.cluster.ClusterLockUtils.LockState;
|
||||
import com.raytheon.uf.edex.database.cluster.ClusterTask;
|
||||
import com.raytheon.uf.edex.database.cluster.handler.CurrentTimeClusterLockHandler;
|
||||
import com.raytheon.uf.edex.database.dao.CoreDao;
|
||||
import com.raytheon.uf.edex.database.dao.DaoConfig;
|
||||
import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
||||
|
@ -95,11 +99,14 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
|||
* Added performance logging
|
||||
* Nov 14, 2014 4953 randerso Moved dumpProductToTempFile into PracticeVtecDecoder
|
||||
* since it had no reason to be in this class
|
||||
* Dec 30, 2014 16942 ryu Fix update of records for sites other than
|
||||
* Feb 05, 2015 16942 ryu Fix update of records for sites other than
|
||||
* the home site and its neighbors.
|
||||
* Pass issuance site id to getActiveTable()
|
||||
* in updateActiveTable() so records will
|
||||
* be updated correctly.
|
||||
* Feb 05, 2015 4099 randerso Fixed latest ETN query for year-end
|
||||
* Feb 23, 2015 4127 dgilling Use cluster locking to only allow 1 active
|
||||
* table write at a time.
|
||||
* Mar 04, 2015 4129 randerso Pass active table change logger to ingestAt and/or MergeVTEC
|
||||
*
|
||||
* </pre>
|
||||
|
@ -115,6 +122,10 @@ public class ActiveTable {
|
|||
private static final Logger changeLog = Logger
|
||||
.getLogger("ActiveTableChange");
|
||||
|
||||
private static final String ACTIVE_TABLE_LOCK_NAME = "ActiveTableWriteLock";
|
||||
|
||||
private static final long DEFAULT_LOCK_TIMEOUT = 5 * TimeUtil.MILLIS_PER_MINUTE;
|
||||
|
||||
private static ThreadLocal<PythonScript> threadLocalPythonScript = new ThreadLocal<PythonScript>() {
|
||||
|
||||
/*
|
||||
|
@ -289,7 +300,7 @@ public class ActiveTable {
|
|||
*/
|
||||
private void updateActiveTable(String siteId,
|
||||
List<ActiveTableRecord> newRecords, float offsetSecs) {
|
||||
if (newRecords.size() > 0) {
|
||||
if (!newRecords.isEmpty()) {
|
||||
ActiveTableMode mode = ActiveTableMode.PRACTICE;
|
||||
if (newRecords.get(0) instanceof OperationalActiveTableRecord) {
|
||||
mode = ActiveTableMode.OPERATIONAL;
|
||||
|
@ -300,37 +311,67 @@ public class ActiveTable {
|
|||
IPerformanceStatusHandler perfStat = PerformanceStatus
|
||||
.getHandler("ActiveTable");
|
||||
ITimer timer = TimeUtil.getTimer();
|
||||
timer.start();
|
||||
List<ActiveTableRecord> activeTable = getActiveTable(issueSiteId,
|
||||
mode);
|
||||
timer.stop();
|
||||
perfStat.logDuration("getActiveTable", timer.getElapsedTime());
|
||||
MergeResult result = null;
|
||||
ClusterTask writeLock = null;
|
||||
try {
|
||||
boolean logFirst = true;
|
||||
timer.start();
|
||||
do {
|
||||
if (logFirst) {
|
||||
statusHandler
|
||||
.info("updateActiveTable() waiting on lock ["
|
||||
+ ACTIVE_TABLE_LOCK_NAME + ":"
|
||||
+ mode.toString() + "].");
|
||||
logFirst = false;
|
||||
}
|
||||
writeLock = ClusterLockUtils.lock(ACTIVE_TABLE_LOCK_NAME,
|
||||
mode.toString(), new CurrentTimeClusterLockHandler(
|
||||
DEFAULT_LOCK_TIMEOUT, false), true);
|
||||
} while (!writeLock.getLockState().equals(LockState.SUCCESSFUL));
|
||||
statusHandler
|
||||
.info("updateActiveTable() obtained lock ["
|
||||
+ ACTIVE_TABLE_LOCK_NAME + ":"
|
||||
+ mode.toString() + "].");
|
||||
timer.stop();
|
||||
perfStat.logDuration("getLock", timer.getElapsedTime());
|
||||
|
||||
// get decoder sites to see if we need to backup active table
|
||||
Set<String> decoderSites = getDecoderSites(siteId);
|
||||
|
||||
// if any new record is from one of the decoder sites
|
||||
// we need to queue a backup
|
||||
for (ActiveTableRecord rec : newRecords) {
|
||||
if (decoderSites.contains(rec.getOfficeid())) {
|
||||
ActiveTableBackup.queue(mode, activeTable);
|
||||
break;
|
||||
timer.reset();
|
||||
timer.start();
|
||||
List<ActiveTableRecord> activeTable = getActiveTable(
|
||||
issueSiteId, mode);
|
||||
timer.stop();
|
||||
perfStat.logDuration("getActiveTable", timer.getElapsedTime());
|
||||
// get decoder sites to see if we need to backup active table
|
||||
Set<String> decoderSites = getDecoderSites(siteId);
|
||||
// if any new record is from one of the decoder sites
|
||||
// we need to queue a backup
|
||||
for (ActiveTableRecord rec : newRecords) {
|
||||
if (decoderSites.contains(rec.getOfficeid())) {
|
||||
ActiveTableBackup.queue(mode, activeTable);
|
||||
break;
|
||||
}
|
||||
}
|
||||
timer.reset();
|
||||
timer.start();
|
||||
result = filterTable(siteId, activeTable, newRecords, mode,
|
||||
offsetSecs);
|
||||
timer.stop();
|
||||
perfStat.logDuration("filterTable", timer.getElapsedTime());
|
||||
timer.reset();
|
||||
timer.start();
|
||||
updateTable(siteId, result, mode);
|
||||
timer.stop();
|
||||
perfStat.logDuration("updateTable", timer.getElapsedTime());
|
||||
} finally {
|
||||
if (writeLock != null) {
|
||||
statusHandler.info("updateActiveTable() released lock ["
|
||||
+ ACTIVE_TABLE_LOCK_NAME + ":" + mode.toString()
|
||||
+ "].");
|
||||
ClusterLockUtils.unlock(writeLock, true);
|
||||
}
|
||||
}
|
||||
|
||||
timer.reset();
|
||||
timer.start();
|
||||
MergeResult result = filterTable(siteId, activeTable, newRecords,
|
||||
mode, offsetSecs);
|
||||
timer.stop();
|
||||
perfStat.logDuration("filterTable", timer.getElapsedTime());
|
||||
|
||||
timer.reset();
|
||||
timer.start();
|
||||
updateTable(siteId, result, mode);
|
||||
timer.stop();
|
||||
perfStat.logDuration("updateTable", timer.getElapsedTime());
|
||||
if (result.changeList.size() > 0) {
|
||||
if (!result.changeList.isEmpty()) {
|
||||
sendNotification(mode, result.changeList, "VTECDecoder");
|
||||
}
|
||||
}
|
||||
|
@ -408,29 +449,28 @@ public class ActiveTable {
|
|||
ActiveTableMode mode, String phensigList, String action,
|
||||
String etn, Calendar currentTime, boolean requestValidTimes,
|
||||
boolean latestEtn) {
|
||||
synchronized (ActiveTable.class) {
|
||||
DatabaseQuery query = null;
|
||||
CoreDao dao = null;
|
||||
DatabaseQuery query = null;
|
||||
CoreDao dao = null;
|
||||
|
||||
if (mode.equals(ActiveTableMode.OPERATIONAL)) {
|
||||
query = new DatabaseQuery(OperationalActiveTableRecord.class);
|
||||
dao = operationalDao;
|
||||
} else {
|
||||
query = new DatabaseQuery(PracticeActiveTableRecord.class);
|
||||
dao = practiceDao;
|
||||
}
|
||||
if (mode.equals(ActiveTableMode.OPERATIONAL)) {
|
||||
query = new DatabaseQuery(OperationalActiveTableRecord.class);
|
||||
dao = operationalDao;
|
||||
} else {
|
||||
query = new DatabaseQuery(PracticeActiveTableRecord.class);
|
||||
dao = practiceDao;
|
||||
}
|
||||
|
||||
if (phensigList != null) {
|
||||
query.addQueryParam("phensig", phensigList, "in");
|
||||
}
|
||||
if (phensigList != null) {
|
||||
query.addQueryParam("phensig", phensigList, "in");
|
||||
}
|
||||
|
||||
if (action != null) {
|
||||
query.addQueryParam("act", action, "in");
|
||||
}
|
||||
if (action != null) {
|
||||
query.addQueryParam("act", action, "in");
|
||||
}
|
||||
|
||||
if (etn != null) {
|
||||
query.addQueryParam("etn", etn, "in");
|
||||
}
|
||||
if (etn != null) {
|
||||
query.addQueryParam("etn", etn, "in");
|
||||
}
|
||||
|
||||
if (requestValidTimes && (currentTime != null)) {
|
||||
// Current Time
|
||||
|
@ -444,18 +484,29 @@ public class ActiveTable {
|
|||
query.addOrder("etn", false);
|
||||
query.setMaxResults(1);
|
||||
}
|
||||
|
||||
query.addQueryParam("officeid", siteId, "in");
|
||||
|
||||
List<ActiveTableRecord> result = null;
|
||||
try {
|
||||
result = (List<ActiveTableRecord>) dao.queryByCriteria(query);
|
||||
} catch (DataAccessLayerException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error querying active table for site " + siteId, e);
|
||||
}
|
||||
return result;
|
||||
if (requestValidTimes && currentTime != null) {
|
||||
// Current Time
|
||||
query.addQueryParam("endTime", currentTime, "greater_than");
|
||||
}
|
||||
if (latestEtn && currentTime != null) {
|
||||
Calendar yearStart = Calendar.getInstance();
|
||||
yearStart.set(currentTime.get(Calendar.YEAR), Calendar.JANUARY, 1,
|
||||
0, 0);
|
||||
query.addQueryParam("issueTime", yearStart, "greater_than");
|
||||
query.addOrder("etn", false);
|
||||
query.setMaxResults(1);
|
||||
}
|
||||
|
||||
query.addQueryParam("officeid", siteId, "in");
|
||||
|
||||
List<ActiveTableRecord> result = null;
|
||||
try {
|
||||
result = (List<ActiveTableRecord>) dao.queryByCriteria(query);
|
||||
} catch (DataAccessLayerException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error querying active table for site " + siteId, e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -468,23 +519,12 @@ public class ActiveTable {
|
|||
*/
|
||||
private static void updateTable(String siteId, MergeResult changes,
|
||||
ActiveTableMode mode) {
|
||||
synchronized (ActiveTable.class) {
|
||||
List<ActiveTableRecord> updated = changes.updatedList;
|
||||
List<ActiveTableRecord> purged = changes.purgedList;
|
||||
List<ActiveTableRecord> updated = changes.updatedList;
|
||||
List<ActiveTableRecord> purged = changes.purgedList;
|
||||
|
||||
CoreDao dao = null;
|
||||
if (mode.equals(ActiveTableMode.OPERATIONAL)) {
|
||||
dao = operationalDao;
|
||||
} else {
|
||||
dao = practiceDao;
|
||||
}
|
||||
for (ActiveTableRecord update : updated) {
|
||||
dao.saveOrUpdate(update);
|
||||
}
|
||||
for (ActiveTableRecord delete : purged) {
|
||||
dao.delete(delete);
|
||||
}
|
||||
}
|
||||
CoreDao dao = (ActiveTableMode.OPERATIONAL.equals(mode)) ? operationalDao
|
||||
: practiceDao;
|
||||
dao.bulkSaveOrUpdateAndDelete(updated, purged);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -555,22 +595,23 @@ public class ActiveTable {
|
|||
ActiveTableMode tableName, List<ActiveTableRecord> newRecords,
|
||||
float timeOffset, boolean makeBackup, boolean runIngestAT,
|
||||
String xmlSource) throws JepException {
|
||||
String scriptName = runIngestAT ? "ingestAT.py" : "MergeVTEC.py";
|
||||
IPathManager pathMgr = PathManagerFactory.getPathManager();
|
||||
LocalizationContext commonCx = pathMgr.getContext(
|
||||
LocalizationType.COMMON_STATIC, LocalizationLevel.BASE);
|
||||
String scriptPath = pathMgr.getFile(commonCx,
|
||||
FileUtil.join(ActiveTablePyIncludeUtil.VTEC, scriptName))
|
||||
.getPath();
|
||||
String pythonIncludePath = PyUtil.buildJepIncludePath(
|
||||
ActiveTablePyIncludeUtil.getCommonPythonIncludePath(),
|
||||
ActiveTablePyIncludeUtil.getVtecIncludePath(siteId),
|
||||
ActiveTablePyIncludeUtil.getGfeConfigIncludePath(siteId),
|
||||
ActiveTablePyIncludeUtil.getIscScriptsIncludePath());
|
||||
|
||||
MergeResult result = null;
|
||||
PythonScript script = null;
|
||||
ClusterTask writeLock = null;
|
||||
try {
|
||||
String scriptName = runIngestAT ? "ingestAT.py" : "MergeVTEC.py";
|
||||
IPathManager pathMgr = PathManagerFactory.getPathManager();
|
||||
LocalizationContext commonCx = pathMgr.getContext(
|
||||
LocalizationType.COMMON_STATIC, LocalizationLevel.BASE);
|
||||
String scriptPath = pathMgr.getFile(commonCx,
|
||||
FileUtil.join(ActiveTablePyIncludeUtil.VTEC, scriptName))
|
||||
.getPath();
|
||||
String pythonIncludePath = PyUtil.buildJepIncludePath(
|
||||
ActiveTablePyIncludeUtil.getCommonPythonIncludePath(),
|
||||
ActiveTablePyIncludeUtil.getVtecIncludePath(siteId),
|
||||
ActiveTablePyIncludeUtil.getGfeConfigIncludePath(siteId),
|
||||
ActiveTablePyIncludeUtil.getIscScriptsIncludePath());
|
||||
|
||||
try {
|
||||
script = new PythonScript(scriptPath, pythonIncludePath,
|
||||
ActiveTable.class.getClassLoader());
|
||||
|
@ -580,6 +621,23 @@ public class ActiveTable {
|
|||
throw e;
|
||||
}
|
||||
|
||||
boolean logFirst = true;
|
||||
do {
|
||||
if (logFirst) {
|
||||
statusHandler.info("mergeRemoteTable() waiting on lock ["
|
||||
+ ACTIVE_TABLE_LOCK_NAME + ":"
|
||||
+ tableName.toString() + "].");
|
||||
logFirst = false;
|
||||
}
|
||||
writeLock = ClusterLockUtils.lock(ACTIVE_TABLE_LOCK_NAME,
|
||||
tableName.toString(),
|
||||
new CurrentTimeClusterLockHandler(DEFAULT_LOCK_TIMEOUT,
|
||||
false), true);
|
||||
} while (!writeLock.getLockState().equals(LockState.SUCCESSFUL));
|
||||
statusHandler.info("mergeRemoteTable() obtained lock ["
|
||||
+ ACTIVE_TABLE_LOCK_NAME + ":" + tableName.toString()
|
||||
+ "].");
|
||||
|
||||
try {
|
||||
String site4Char = SiteMap.getInstance().getSite4LetterId(
|
||||
siteId);
|
||||
|
@ -603,18 +661,26 @@ public class ActiveTable {
|
|||
"Error merging active table", e);
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (result != null) {
|
||||
updateTable(siteId, result, tableName);
|
||||
}
|
||||
} finally {
|
||||
if (writeLock != null) {
|
||||
statusHandler.info("mergeRemoteTable() released lock ["
|
||||
+ ACTIVE_TABLE_LOCK_NAME + ":" + tableName.toString()
|
||||
+ "].");
|
||||
ClusterLockUtils.unlock(writeLock, true);
|
||||
}
|
||||
|
||||
if (script != null) {
|
||||
script.dispose();
|
||||
script = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (result != null) {
|
||||
updateTable(siteId, result, tableName);
|
||||
if (!result.changeList.isEmpty()) {
|
||||
sendNotification(tableName, result.changeList, "MergeVTEC");
|
||||
}
|
||||
if ((result != null) && (!result.changeList.isEmpty())) {
|
||||
sendNotification(tableName, result.changeList, "MergeVTEC");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
# 06/17/13 #3296 randerso Moved active table backup and purging
|
||||
# to a separate thread in java.
|
||||
# Added performance logging
|
||||
# 02/05/15 #4099 randerso Changed log level of year-end issuance tweak
|
||||
#
|
||||
|
||||
import time
|
||||
|
@ -122,7 +123,7 @@ class ActiveTable(VTECTableUtil.VTECTableUtil):
|
|||
if oldYear < newYear:
|
||||
if (newR['act'] == "EXP" and newR['endTime'] == oldR['endTime']) or \
|
||||
self.__overlaps((oldR['startTime'],oldR['endTime']), (newR['startTime'],newR['endTime'])):
|
||||
LogStream.logVerbose("Reset issuance time to last year:",
|
||||
LogStream.logEvent("Reset issuance time to last year:",
|
||||
"\nNewRec: ", self.printEntry(newR),
|
||||
"OldRec: ", self.printEntry(oldR))
|
||||
newR['issueTime'] = lastYearIssueTime
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
* Dec 12, 2013 2624 rferrel Document Julian time stamp.
|
||||
* May 14, 2014 2881 rferrel Change retention times and data set modifications.
|
||||
* Aug 25, 2014 3537 rferrel Fixed dirPattern in Category Local.
|
||||
* Feb 02, 2015 4066 rferrel Added lightning to Observation category.
|
||||
*
|
||||
* @author rferrel
|
||||
* @version 1.0
|
||||
|
@ -208,7 +209,7 @@
|
|||
<name>Observation</name>
|
||||
<extRetentionHours>168</extRetentionHours>
|
||||
<dataSet>
|
||||
<dirPattern>(airep|binlightning|bufrascat|bufrhdw|bufrmthdw|bufrssmi|lsr|MAROB|maritime|metar|misc_sfc_obs|pirep|sfcobs|shef|svrwx|synoptic)/(\d{4})(\d{2})(\d{2})/(\d{2})</dirPattern>
|
||||
<dirPattern>(airep|binlightning|bufrascat|bufrhdw|bufrmthdw|bufrssmi|entlightning|lsr|MAROB|maritime|metar|misc_sfc_obs|pirep|sfcobs|shef|svrwx|synoptic)/(\d{4})(\d{2})(\d{2})/(\d{2})</dirPattern>
|
||||
<displayLabel>{1}</displayLabel>
|
||||
<dateGroupIndices>2,3,4,5</dateGroupIndices>
|
||||
</dataSet>
|
||||
|
|
|
@ -808,7 +808,12 @@
|
|||
</rule>
|
||||
<!-- Purge rules for MRMS -->
|
||||
<rule>
|
||||
<keyValue>MRMS</keyValue>
|
||||
<keyValue>MRMS_1000</keyValue>
|
||||
<versionsToKeep>120</versionsToKeep>
|
||||
<period>03-00:00:00</period>
|
||||
</rule>
|
||||
<rule>
|
||||
<keyValue>MRMS_0500</keyValue>
|
||||
<versionsToKeep>120</versionsToKeep>
|
||||
<period>03-00:00:00</period>
|
||||
</rule>
|
||||
|
|
|
@ -10,7 +10,8 @@ Require-Bundle: com.raytheon.edex.common,
|
|||
com.raytheon.uf.common.status;bundle-version="1.12.1174",
|
||||
com.raytheon.uf.edex.ndm;bundle-version="1.14.0",
|
||||
com.raytheon.uf.edex.menus;bundle-version="1.0.0",
|
||||
com.raytheon.uf.common.dataplugin.redbook;bundle-version="1.14.0"
|
||||
com.raytheon.uf.common.dataplugin.redbook;bundle-version="1.14.0",
|
||||
org.apache.commons.lang;bundle-version="2.3.0"
|
||||
Export-Package: com.raytheon.uf.edex.plugin.redbook,
|
||||
com.raytheon.uf.edex.plugin.redbook.decoder
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
|
|
|
@ -47,6 +47,7 @@ import com.raytheon.uf.edex.plugin.redbook.menu.RedbookUaMenuUtil;
|
|||
* Mar 19, 2014 2857 mpduff Implement NCO.
|
||||
* Mar 19, 2014 2859 mpduff Implement MPC.
|
||||
* Mar 19, 2014 2860 mpduff Implement Upper Air.
|
||||
* Jan 28, 2015 4030 mpduff Changed constants to public.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -60,22 +61,22 @@ public class RedbookMenuSubscriber implements INationalDatasetSubscriber {
|
|||
.getHandler(RedbookMenuSubscriber.class);
|
||||
|
||||
/** Hazard menu file */
|
||||
private static final String HAZARD_MENU_FILE = "RedbookHazardMenus.xml";
|
||||
public static final String HAZARD_MENU_FILE = "RedbookHazardMenus.xml";
|
||||
|
||||
/** HPC menu file */
|
||||
private static final String HPC_MENU_FILE = "RedbookHPCMenus.xml";
|
||||
public static final String HPC_MENU_FILE = "RedbookHPCMenus.xml";
|
||||
|
||||
/** CPC menu file */
|
||||
private static final String CPC_MENU_FILE = "RedbookCPCMenus.xml";
|
||||
public static final String CPC_MENU_FILE = "RedbookCPCMenus.xml";
|
||||
|
||||
/** MPC menu file */
|
||||
private static final String MPC_MENU_FILE = "RedbookMPCMenus.xml";
|
||||
public static final String MPC_MENU_FILE = "RedbookMPCMenus.xml";
|
||||
|
||||
/** NCO menu file */
|
||||
private static final String NCO_MENU_FILE = "RedbookNCOMenus.xml";
|
||||
public static final String NCO_MENU_FILE = "RedbookNCOMenus.xml";
|
||||
|
||||
/** Upper air menu file */
|
||||
private static final String UA_MENU_FILE = "RedbookUAMenus.xml";
|
||||
public static final String UA_MENU_FILE = "RedbookUAMenus.xml";
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
|
|
|
@ -39,6 +39,7 @@ import javax.xml.bind.annotation.XmlElements;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 12, 2014 2855 mpduff Initial creation
|
||||
* Mar 19, 2014 2860 mpduff Added DataUri.
|
||||
* Jan 28, 2015 4030 mpduff Added addMenuEntry method.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -208,7 +209,7 @@ public class MenuEntry {
|
|||
* @param menuEntryList
|
||||
* the menuEntryList to set
|
||||
*/
|
||||
public void setMenuEntryyList(List<MenuEntry> menuEntryList) {
|
||||
public void setMenuEntryList(List<MenuEntry> menuEntryList) {
|
||||
this.menuEntryList = menuEntryList;
|
||||
}
|
||||
|
||||
|
@ -227,6 +228,18 @@ public class MenuEntry {
|
|||
this.dataUri = dataUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a {@link MenuEntry}
|
||||
*
|
||||
* @param entry
|
||||
*/
|
||||
public void addMenuEntry(MenuEntry entry) {
|
||||
if (this.menuEntryList == null) {
|
||||
menuEntryList = new ArrayList<MenuEntry>();
|
||||
}
|
||||
menuEntryList.add(entry);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
|
|
@ -39,6 +39,7 @@ import javax.xml.bind.annotation.XmlRootElement;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 07, 2014 2858 mpduff Initial creation.
|
||||
* Mar 17, 2014 2855 mpduff Renamed to RedbookMenusXML.java.
|
||||
* Jan 28, 2015 4030 mpduff Added addMenuEntry method.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -78,6 +79,10 @@ public class RedbookMenusXML {
|
|||
this.menuEntryList = menuEntryList;
|
||||
}
|
||||
|
||||
public void addMenuEntry(MenuEntry entry) {
|
||||
menuEntryList.add(entry);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
|
|
@ -0,0 +1,360 @@
|
|||
/**
|
||||
* 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.
|
||||
**/
|
||||
package com.raytheon.uf.edex.plugin.redbook.menu;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.Marshaller;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import com.raytheon.uf.edex.plugin.redbook.ingest.RedbookMenuSubscriber;
|
||||
import com.raytheon.uf.edex.plugin.redbook.ingest.xml.MenuEntry;
|
||||
import com.raytheon.uf.edex.plugin.redbook.ingest.xml.MenuEntryType;
|
||||
import com.raytheon.uf.edex.plugin.redbook.ingest.xml.RedbookMenusXML;
|
||||
|
||||
/**
|
||||
* This class is called from /awips2/edex/bin/ndmMenuIngester.sh.
|
||||
*
|
||||
* It reads in the NDM menu files and outputs an A2 version into the NDM
|
||||
* endpoint on edex.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Jan 30, 2015 4030 mpduff Initial creation
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @author mpduff
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
public class NdmMenuConverter {
|
||||
private static final String WMO = "wmo";
|
||||
|
||||
private static final String OUTPUT_PATH = File.separator + "awips2"
|
||||
+ File.separator + "edex" + File.separator + "data"
|
||||
+ File.separator + "ndm" + File.separator;
|
||||
|
||||
private static final String HPC_FILE = "redbookHPCMenus.txt";
|
||||
|
||||
private static final String CPC_FILE = "redbookCPCMenus.txt";
|
||||
|
||||
private static final String NCO_FILE = "redbookNCOMenus.txt";
|
||||
|
||||
private static final String HAZARDS_FILE = "redbookHazardMenus.txt";
|
||||
|
||||
private static final String MARINE_FILE = "redbookMarineMenus.txt";
|
||||
|
||||
private static final String UPPER_AIR_FILE = "redbookUpperAirMenus.txt";
|
||||
|
||||
private String dataKeysPath;
|
||||
|
||||
private String depictKeysPath;
|
||||
|
||||
private String menuFilePath;
|
||||
|
||||
private String productButtonPath;
|
||||
|
||||
private JAXBContext jax;
|
||||
|
||||
private Marshaller marshaller;
|
||||
|
||||
private File depictFile;
|
||||
|
||||
public NdmMenuConverter() {
|
||||
createContext();
|
||||
}
|
||||
|
||||
public void convert() {
|
||||
RedbookMenusXML menuXml = new RedbookMenusXML();
|
||||
MenuEntry titleMenuEntry;
|
||||
int sepCounter = 0;
|
||||
List<MenuEntry> subMenuList = new ArrayList<MenuEntry>();
|
||||
|
||||
try {
|
||||
File dataFile = new File(this.dataKeysPath);
|
||||
File menuFile = new File(this.menuFilePath);
|
||||
depictFile = new File(this.depictKeysPath);
|
||||
File productButtonFile = new File(this.productButtonPath);
|
||||
|
||||
List<String> dataKeys = Files.readAllLines(dataFile.toPath(),
|
||||
Charset.defaultCharset());
|
||||
List<String> depictKeys = Files.readAllLines(depictFile.toPath(),
|
||||
Charset.defaultCharset());
|
||||
List<String> lines = Files.readAllLines(menuFile.toPath(),
|
||||
Charset.defaultCharset());
|
||||
List<String> productButtonKeys = Files.readAllLines(
|
||||
productButtonFile.toPath(), Charset.defaultCharset());
|
||||
Map<String, String> menuTextMap = getMenuTextMap(productButtonKeys);
|
||||
Map<String, String> dataKeyMap = getSubstitutionMap(dataKeys);
|
||||
|
||||
MenuEntry subMenuEntry = null;
|
||||
|
||||
int subMenuCount = -1;
|
||||
for (String line : lines) {
|
||||
line = line.trim();
|
||||
if (line.startsWith("submenu")) {
|
||||
subMenuCount++;
|
||||
if (line.contains("&")) {
|
||||
line = line.replace("&", "&&");
|
||||
}
|
||||
|
||||
String[] parts = line.split(":");
|
||||
String text = parts[1].replace("\"", "");
|
||||
|
||||
subMenuEntry = new MenuEntry();
|
||||
subMenuEntry.setFile(null);
|
||||
subMenuEntry.setType(MenuEntryType.Submenu);
|
||||
subMenuEntry.setText(text.trim());
|
||||
|
||||
subMenuList.add(subMenuEntry);
|
||||
} else if (line.startsWith("title")) {
|
||||
String[] parts = line.split(":");
|
||||
String text = parts[1].replace("\"", "");
|
||||
titleMenuEntry = new MenuEntry();
|
||||
titleMenuEntry.setFile(null);
|
||||
titleMenuEntry.setType(MenuEntryType.Title);
|
||||
titleMenuEntry.setText(text);
|
||||
titleMenuEntry.setId(text);
|
||||
subMenuList.get(subMenuCount).addMenuEntry(titleMenuEntry);
|
||||
} else if (line.startsWith("productButton")) {
|
||||
String[] parts = line.split(":");
|
||||
MenuEntry me = new MenuEntry();
|
||||
me.setFile(null);
|
||||
me.setType(MenuEntryType.ProductButton);
|
||||
/*
|
||||
* There are certain productButtons in the NCO menu data
|
||||
* keys in the (25000 range) that have data keys that don't
|
||||
* map to anything. This results in those menu items not
|
||||
* being created. The site will need to fix this after
|
||||
* generating the new menus.
|
||||
*/
|
||||
String dataKey = parts[1].trim().substring(0, 4);
|
||||
StringBuilder subValue = new StringBuilder();
|
||||
// Find the matching value
|
||||
for (String depictKeyLine : depictKeys) {
|
||||
if (depictKeyLine.trim().startsWith(dataKey)) {
|
||||
String[] depictKeyParts = depictKeyLine
|
||||
.split("\\|");
|
||||
me.setText(menuTextMap.get(dataKey));
|
||||
me.setId(depictKeyParts[6].trim());
|
||||
subMenuList.get(subMenuCount).addMenuEntry(me);
|
||||
|
||||
String[] subParts = depictKeyParts[2].split(",");
|
||||
MenuEntry subEntry = new MenuEntry();
|
||||
subEntry.setFile(null);
|
||||
subEntry.setType(MenuEntryType.Substitute);
|
||||
subEntry.setKey(WMO);
|
||||
|
||||
for (String subPart : subParts) {
|
||||
for (String key : dataKeyMap.keySet()) {
|
||||
if (key.startsWith(subPart)) {
|
||||
subValue.append(dataKeyMap.get(key))
|
||||
.append(",");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String subValueStr = subValue.toString();
|
||||
subValueStr = StringUtils.removeEnd(subValueStr,
|
||||
",");
|
||||
subEntry.setValue(subValueStr);
|
||||
me.addMenuEntry(subEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (line.startsWith("endSubmenu")) {
|
||||
// subMenuList.add(subMenuEntry);
|
||||
MenuEntry closedSubMenu = subMenuList.remove(subMenuCount);
|
||||
subMenuCount--;
|
||||
if (subMenuCount == -1) {
|
||||
menuXml.addMenuEntry(closedSubMenu);
|
||||
} else {
|
||||
subMenuList.get(subMenuCount).addMenuEntry(
|
||||
closedSubMenu);
|
||||
}
|
||||
} else if (line.startsWith("separator")) {
|
||||
MenuEntry sep = new MenuEntry();
|
||||
sep.setFile(null);
|
||||
sep.setType(MenuEntryType.Separator);
|
||||
sep.setId("Separator" + sepCounter++);
|
||||
subMenuList.get(subMenuCount).addMenuEntry(sep);
|
||||
}
|
||||
}
|
||||
|
||||
// Set output file name
|
||||
String inputFileName = menuFile.getName();
|
||||
String outputFileName = null;
|
||||
if (inputFileName.equals(CPC_FILE)) {
|
||||
outputFileName = RedbookMenuSubscriber.CPC_MENU_FILE;
|
||||
} else if (inputFileName.equals(HPC_FILE)) {
|
||||
outputFileName = RedbookMenuSubscriber.HPC_MENU_FILE;
|
||||
} else if (inputFileName.equals(NCO_FILE)) {
|
||||
outputFileName = RedbookMenuSubscriber.NCO_MENU_FILE;
|
||||
} else if (inputFileName.equals(HAZARDS_FILE)) {
|
||||
outputFileName = RedbookMenuSubscriber.HAZARD_MENU_FILE;
|
||||
} else if (inputFileName.equals(MARINE_FILE)) {
|
||||
outputFileName = RedbookMenuSubscriber.MPC_MENU_FILE;
|
||||
} else if (inputFileName.equals(UPPER_AIR_FILE)) {
|
||||
outputFileName = RedbookMenuSubscriber.UA_MENU_FILE;
|
||||
} else {
|
||||
throw new IOException("Error processing file");
|
||||
}
|
||||
|
||||
marshaller.marshal(menuXml, new File(OUTPUT_PATH + outputFileName));
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error occurred processing file: "
|
||||
+ menuFilePath);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a map of menu keys to menu text.
|
||||
*
|
||||
* @param productButtonKeys
|
||||
* List of strings from redbookProductButtons.txt
|
||||
*
|
||||
* @return Map for key -> menu text
|
||||
*/
|
||||
private Map<String, String> getMenuTextMap(List<String> productButtonKeys) {
|
||||
Map<String, String> menuTextMap = new HashMap<String, String>();
|
||||
for (String line : productButtonKeys) {
|
||||
line = line.trim();
|
||||
// Skip comment lines
|
||||
if (line.startsWith("#") || line.trim().length() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] parts = line.split("\\|");
|
||||
menuTextMap.put(parts[0].trim(), parts[2].trim());
|
||||
}
|
||||
|
||||
return menuTextMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a map of key to substitution values.
|
||||
*
|
||||
* @param dataKeys
|
||||
* List of strings from the redbookDataKeys.txt file
|
||||
* @returnMap for key -> substitution string
|
||||
*/
|
||||
private Map<String, String> getSubstitutionMap(List<String> dataKeys) {
|
||||
Map<String, String> dataKeyMap = new HashMap<String, String>();
|
||||
for (String line : dataKeys) {
|
||||
line = line.trim();
|
||||
// Skip comment lines
|
||||
if (line.startsWith("#") || line.trim().length() == 0) {
|
||||
continue;
|
||||
}
|
||||
String[] parts = line.split("\\|");
|
||||
dataKeyMap.put(parts[0].trim(), parts[10].substring(0, 6));
|
||||
}
|
||||
|
||||
return dataKeyMap;
|
||||
}
|
||||
|
||||
public String getDataKeysPath() {
|
||||
return dataKeysPath;
|
||||
}
|
||||
|
||||
public void setDataKeysPath(String dataKeysPath) {
|
||||
this.dataKeysPath = dataKeysPath;
|
||||
}
|
||||
|
||||
public String getDepictKeysPath() {
|
||||
return depictKeysPath;
|
||||
}
|
||||
|
||||
public void setDepictKeysPath(String depictKeysPath) {
|
||||
this.depictKeysPath = depictKeysPath;
|
||||
}
|
||||
|
||||
public String getMenuFilePath() {
|
||||
return menuFilePath;
|
||||
}
|
||||
|
||||
public void setMenuFilePath(String menuFilePath) {
|
||||
this.menuFilePath = menuFilePath;
|
||||
}
|
||||
|
||||
public void setProductButtonPath(String productButtonPath) {
|
||||
this.productButtonPath = productButtonPath;
|
||||
}
|
||||
|
||||
public String getProductButtonPath() {
|
||||
return this.productButtonPath;
|
||||
}
|
||||
|
||||
private void createContext() {
|
||||
Class[] classes = new Class[] { MenuEntry.class, MenuEntryType.class,
|
||||
RedbookMenusXML.class };
|
||||
|
||||
try {
|
||||
jax = JAXBContext.newInstance(classes);
|
||||
this.marshaller = jax.createMarshaller();
|
||||
this.marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
if (args.length != 2) {
|
||||
System.err.println("Unexpected Arguments");
|
||||
System.err
|
||||
.println("Expecting local NDM directory and NDM File Menu Name");
|
||||
return;
|
||||
}
|
||||
|
||||
String dirPath = args[0];
|
||||
if (!dirPath.endsWith(File.separator)) {
|
||||
dirPath = dirPath.concat(File.separator);
|
||||
}
|
||||
String menuFile = dirPath + args[1];
|
||||
String dataKeysFile = dirPath + "redbookDataKeys.txt";
|
||||
String depictKeysFile = dirPath + "redbookDepictKeys.txt";
|
||||
String productButtonFile = dirPath + "redbookProductButtons.txt";
|
||||
|
||||
NdmMenuConverter converter = new NdmMenuConverter();
|
||||
converter.setDataKeysPath(dataKeysFile);
|
||||
converter.setMenuFilePath(menuFile);
|
||||
converter.setDepictKeysPath(depictKeysFile);
|
||||
converter.setProductButtonPath(productButtonFile);
|
||||
converter.convert();
|
||||
|
||||
}
|
||||
}
|
|
@ -27,6 +27,7 @@
|
|||
# ------------ ---------- ----------- --------------------------
|
||||
# 03/20/14 #2933 randerso Changed PRDDIR and LOGDIR to use
|
||||
# Backup site's configuration
|
||||
# 01/30/15 #17081 lshi Added backup vtec
|
||||
##############################################################################
|
||||
|
||||
import_file=${1}
|
||||
|
@ -175,6 +176,9 @@ log_msg 80
|
|||
cp -r GFEconfig/edex_static/site/smartinit ${edex_site_si_dest}
|
||||
log_msg 90
|
||||
cp -r GFEconfig/cave_static/site/* ${cave_site_dest}
|
||||
# DR 17081
|
||||
log_msg 91
|
||||
cp -r GFEconfig/common_static/site/vtec ${common_site_dest}
|
||||
log_msg 93
|
||||
# DR 16464
|
||||
cp -a GFEConfig/site/rsync_parms.${SITE_CAPS} ${rsync_parms_dest}.${SITE_CAPS}
|
||||
|
|
|
@ -7,8 +7,7 @@ import sys, os, getopt, string
|
|||
import logging
|
||||
import traceback
|
||||
|
||||
#import dynamicserialize.dstypes.com.raytheon.uf.common.activetable.SendPracticeProductRequest as SendPracticeProductRequest
|
||||
import dynamicserialize.dstypes.com.raytheon.uf.common.activetable.PracticeProductOfftimeRequest as PracticeProductOfftimeRequest
|
||||
from dynamicserialize.dstypes.com.raytheon.uf.common.activetable import SendPracticeProductRequest
|
||||
from ufpy import ThriftClient
|
||||
from ufpy import TimeUtil
|
||||
|
||||
|
@ -26,7 +25,7 @@ class VTECDecoder(object):
|
|||
"""
|
||||
thriftClient = ThriftClient.ThriftClient(self._host, self._port, '/services')
|
||||
|
||||
request = PracticeProductOfftimeRequest()
|
||||
request = SendPracticeProductRequest()
|
||||
request.setProductText(self._getProduct())
|
||||
request.setDrtString(self._offtimeStr)
|
||||
request.setNotifyGFE(self._notifyGFE)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
# and inland threats
|
||||
# UPDATED: 11 Sept 2014 - JCM - completed updates above
|
||||
# UPDATED: 20 Oct. 2014 - JCM - set up for 2015 season
|
||||
# UPDATED: 18 Feb. 2015 - JCM - added full path for logos.png
|
||||
#
|
||||
########################################################################
|
||||
# CONFIGURATION SECTION BELOW
|
||||
|
@ -41,7 +42,7 @@ convert -size 200x500 xc:black temp.png
|
|||
convert temp.png null: -matte -compose Clear -composite -compose Over transparent.png
|
||||
|
||||
# insert the logos at the bottom
|
||||
composite -gravity south -geometry +0+0 logos.png transparent.png trans2.png
|
||||
composite -gravity south -geometry +0+0 ${HTI_HOME}/bin/logos.png transparent.png trans2.png
|
||||
|
||||
# write the date onto the image
|
||||
DATE=`date +"Issued %F %H%MZ"`
|
||||
|
@ -81,7 +82,6 @@ convert trans2b.png -font Century-Schoolbook-Bold -pointsize 20 -fill black -ann
|
|||
convert trans2b.png -font Century-Schoolbook-Bold -pointsize 20 -fill black -annotate +5+250 "Threat" \
|
||||
-annotate +5+230 "Wind" windthreatlegend.png
|
||||
|
||||
#echo ${PRODUCTdir}
|
||||
chmod 666 *legend.png
|
||||
mv *legend.png ${PRODUCTdir}/
|
||||
|
||||
|
|
0
edexOsgi/com.raytheon.uf.tools.gfesuite/hti/bin/logos.png
Normal file → Executable file
0
edexOsgi/com.raytheon.uf.tools.gfesuite/hti/bin/logos.png
Normal file → Executable file
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
18
edexOsgi/com.raytheon.uf.tools.gfesuite/hti/bin/make_hti.sh
Executable file → Normal file
18
edexOsgi/com.raytheon.uf.tools.gfesuite/hti/bin/make_hti.sh
Executable file → Normal file
|
@ -5,7 +5,7 @@
|
|||
# Shell Used: BASH shell
|
||||
# Original Author(s): Douglas.Gaer@noaa.gov
|
||||
# File Creation Date: 01/27/2009
|
||||
# Date Last Modified: 10/20/2014
|
||||
# Date Last Modified: 02/20/2015
|
||||
#
|
||||
# Contributors:
|
||||
# Joe Maloney (MFL), Pablo Santos (MFL)
|
||||
|
@ -33,6 +33,9 @@
|
|||
# History:
|
||||
# 20 OCT 2014 - jcm - created from make_ghls.sh, broke out of webapps
|
||||
# package. Renamed make_hti.sh.
|
||||
# 20 FEB 2015 - jcm - modified ifpIMAGE line to use ssh -x px2f; fixed
|
||||
# LOG_FILE at end of script; corrected $site variable
|
||||
# for kml rsync.
|
||||
#
|
||||
########################################################################
|
||||
# CHECK TO SEE IF SITE ID WAS PASSED AS ARGUMENT
|
||||
|
@ -84,7 +87,7 @@ fi
|
|||
# Log file header
|
||||
echo " " >> $LOG_FILE
|
||||
echo "####################################################################################" >> $LOG_FILE
|
||||
echo "# Starting Make_HTI Script.... #" >> $LOG_FILE
|
||||
echo "# Starting Make_HTI Script.... #" >> $LOG_FILE
|
||||
echo "####################################################################################" >> $LOG_FILE
|
||||
chmod 666 $LOG_FILE
|
||||
|
||||
|
@ -112,7 +115,7 @@ for PARM in $PARMS
|
|||
do
|
||||
# NOTE: cannot run ifpIMAGE on dx3/dx4 - must ssh to a px
|
||||
echo "Creating ${PARM} image..." >> $LOG_FILE
|
||||
ssh px1 "unset DISPLAY; ${GFEBINdir}/ifpIMAGE -site ${SITE} -c ${PARM} -o ${PRODUCTdir}"
|
||||
ssh -x px2f "unset DISPLAY; ${GFEBINdir}/ifpIMAGE -site ${SITE} -c ${PARM} -o ${PRODUCTdir}"
|
||||
convert ${PRODUCTdir}/${SITE}${PARM}.png -resize 104x148 ${PRODUCTdir}/${SITE}${PARM}_sm.png
|
||||
done
|
||||
|
||||
|
@ -120,8 +123,7 @@ rm -f ${PRODUCTdir}/*.info
|
|||
|
||||
# Generate KML automatically via runProcedure
|
||||
echo "Running KML procedure." >> $LOG_FILE
|
||||
#ssh px1 "unset DISPLAY; ${GFEBINdir}/runProcedure -site ${SITE} -n TCImpactGraphics_KML -c gfeConfig"
|
||||
ssh px1 "unset DISPLAY; ${GFEBINdir}/runProcedure -site ${SITE} -n TCImpactGraphics_KML2015 -c gfeConfig"
|
||||
ssh -x px2f "unset DISPLAY; ${GFEBINdir}/runProcedure -site ${SITE} -n TCImpactGraphics_KML -c gfeConfig"
|
||||
|
||||
# Create legends for KML
|
||||
${HTI_HOME}/bin/kml_legend.sh
|
||||
|
@ -139,7 +141,7 @@ echo "/usr/bin/ssh -o stricthostkeychecking=no -x ${LDADuser}@${LDADserver} ${CM
|
|||
/usr/bin/ssh -o stricthostkeychecking=no -x ${LDADuser}@${LDADserver} ${CMD}
|
||||
|
||||
echo "Copying KML.TXT files to NWSHQ Web farm ${NWSHQ_RSYNCSERVER}" >> $LOG_FILE
|
||||
CMD="/usr/bin/rsync -av --force --progress --stats ${LDAD_DATA}/*.txt ${NWSHQ_RSYNCSERVER}::ghls_includes/${siteid}"
|
||||
CMD="/usr/bin/rsync -av --force --progress --stats ${LDAD_DATA}/*.txt ${NWSHQ_RSYNCSERVER}::ghls_includes/${site}"
|
||||
echo "/usr/bin/ssh -o stricthostkeychecking=no -x ${LDADuser}@${LDADserver} ${CMD}" >> $LOG_FILE
|
||||
/usr/bin/ssh -o stricthostkeychecking=no -x ${LDADuser}@${LDADserver} "${CMD}"
|
||||
echo "Copy to ${NWSHQ_RSYNCSERVER} complete" >> $LOG_FILE
|
||||
|
@ -193,7 +195,7 @@ else
|
|||
echo "**** ${HTI_HOME}/etc/sitevars.${site}" >> $LOG_FILE
|
||||
fi
|
||||
|
||||
echo "Script complete at $(date)" >> ${LOGfile}
|
||||
echo " " >> ${LOGfile}
|
||||
echo "Script complete at $(date)" >> ${LOG_FILE}
|
||||
echo " " >> ${LOG_FILE}
|
||||
exit 0
|
||||
########################################################################
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -30,6 +30,7 @@
|
|||
* new local fields to
|
||||
* mpe_qpe_fields and
|
||||
* mpe_qpe_dependencies
|
||||
* 2/4/2015 C Gobs DR 17069 - mpe_generate_list - token value too short
|
||||
********************************************************************************
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
|
@ -130,6 +131,7 @@ const static char * mpe_qpe_dependencies [ NUM_BEST_PRODUCTS ] =
|
|||
/* GageOnly Generation rule in case mpe_del_gage_zeros token is OFF. */
|
||||
const static char * gageonly_del_gages_off = "" ;
|
||||
|
||||
#define MPE_GENERATE_LIST_REPLY_LEN 512
|
||||
|
||||
/*******************************************************************************
|
||||
* MODULE NUMBER: 1
|
||||
|
@ -514,7 +516,7 @@ void get_mpe_product_state ( const char * product , const int * product_len ,
|
|||
char mpe_del_gage_zeros_reply [ MPE_PRODUCT_REPLY_LEN ] = { '\0' } ;
|
||||
char mpe_generate_areal_qpe_reply [ MPE_PRODUCT_REPLY_LEN ] = {'\0'};
|
||||
static char * mpe_generate_list_token = MPE_GENERATE_LIST_TOKEN ;
|
||||
char mpe_generate_list_reply [ MPE_PRODUCT_REPLY_LEN ] = { '\0' } ;
|
||||
char mpe_generate_list_reply [ MPE_GENERATE_LIST_REPLY_LEN ] = { '\0' } ;
|
||||
static char mpe_qpe_fieldtype [ BESTFIELD_LEN] = { '\0' } ;
|
||||
char * pChar = NULL ;
|
||||
char * pString = NULL ;
|
||||
|
@ -598,9 +600,10 @@ void get_mpe_product_state ( const char * product , const int * product_len ,
|
|||
"empty.\n" , mpe_generate_list_token ) ;
|
||||
}
|
||||
|
||||
memset ( mpe_generate_list_reply , '\0' , MPE_PRODUCT_REPLY_LEN ) ;
|
||||
memset ( mpe_generate_list_reply , '\0' , MPE_GENERATE_LIST_REPLY_LEN ) ;
|
||||
}
|
||||
printf("get_mpe_product_state(): mpe_generate_list_reply = :%s: \n", mpe_generate_list_reply);
|
||||
printf("get_mpe_product_state(): mpe_generate_list_reply = :%s: characters in mpe_generate_list_reply = %d max = %d\n", mpe_generate_list_reply,
|
||||
strlen(mpe_generate_list_reply), MPE_GENERATE_LIST_REPLY_LEN);
|
||||
|
||||
/* Get the value of the mpe_del_gage_zeros token. */
|
||||
request_len = strlen ( mpe_del_gage_zeros_token ) ;
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
##
|
||||
# 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.
|
||||
##
|
||||
|
||||
# File auto-generated against equivalent DynamicSerialize Java class
|
||||
|
||||
class PracticeProductOfftimeRequest(object):
|
||||
|
||||
def __init__(self):
|
||||
self.drtString = None
|
||||
self.notifyGFE = None
|
||||
self.productText = None
|
||||
|
||||
def getDrtString(self):
|
||||
return self.drtString
|
||||
|
||||
def setDrtString(self, drtString):
|
||||
self.drtString = drtString
|
||||
|
||||
def getNotifyGFE(self):
|
||||
return self.notifyGFE
|
||||
|
||||
def setNotifyGFE(self, notifyGFE):
|
||||
self.notifyGFE = notifyGFE
|
||||
|
||||
def getProductText(self):
|
||||
return self.productText
|
||||
|
||||
def setProductText(self, productText):
|
||||
self.productText = productText
|
||||
|
|
@ -23,8 +23,22 @@
|
|||
class SendPracticeProductRequest(object):
|
||||
|
||||
def __init__(self):
|
||||
self.drtString = None
|
||||
self.notifyGFE = None
|
||||
self.productText = None
|
||||
|
||||
def getDrtString(self):
|
||||
return self.drtString
|
||||
|
||||
def setDrtString(self, drtString):
|
||||
self.drtString = drtString
|
||||
|
||||
def getNotifyGFE(self):
|
||||
return self.notifyGFE
|
||||
|
||||
def setNotifyGFE(self, notifyGFE):
|
||||
self.notifyGFE = notifyGFE
|
||||
|
||||
def getProductText(self):
|
||||
return self.productText
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@ __all__ = [
|
|||
'GetVtecAttributeResponse',
|
||||
'OperationalActiveTableRecord',
|
||||
'PracticeActiveTableRecord',
|
||||
'PracticeProductOfftimeRequest',
|
||||
'SendPracticeProductRequest',
|
||||
'VTECChange',
|
||||
'VTECTableChangeNotification',
|
||||
|
@ -51,7 +50,6 @@ from GetVtecAttributeRequest import GetVtecAttributeRequest
|
|||
from GetVtecAttributeResponse import GetVtecAttributeResponse
|
||||
from OperationalActiveTableRecord import OperationalActiveTableRecord
|
||||
from PracticeActiveTableRecord import PracticeActiveTableRecord
|
||||
from PracticeProductOfftimeRequest import PracticeProductOfftimeRequest
|
||||
from SendPracticeProductRequest import SendPracticeProductRequest
|
||||
from VTECChange import VTECChange
|
||||
from VTECTableChangeNotification import VTECTableChangeNotification
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
# Name changes to reflect plugin names for modelsounding, goessounding, poessounding.
|
||||
#20140424 3068 dgilling Add pattern for MetOp-B ASCAT T winds.
|
||||
#20140612 3230 rferrel Add pattern for URMA.
|
||||
#20150202 4066 rferrel Add pattern form Earth Networks Total Lightning: SFPA42
|
||||
#***************************************************************
|
||||
# AWIPS 1 PATTERN GRAPHIC ^[PQ].* /redbook/Raw
|
||||
# PGNA00 KWNS 010001 !redbook 1_1/NMCGPHMCD/MCDSUM/PXSF001CN/20110201 0001
|
||||
|
@ -431,6 +432,11 @@ HDS ^(IUS(Z[0-9]|Y4)[0-9]) ([A-Z]{4}) (..)(..)(..)
|
|||
HDS ^(SF(US|PA)41) ([A-Z]{4}) (..)(..)(..)
|
||||
FILE -overwrite -log -edex -close /data_store/binlightning/(\4:yyyy)(\4:mm)\4/\5/\1_\3_\4\5\6_(seq).nldn.%Y%m%d%H
|
||||
|
||||
# WMO Heading for Earth Networks Total Lightning
|
||||
|
||||
NGRID ^(SFPA42) ([A-Z]{4}) (..)(..)(..)
|
||||
FILE -overwrite -log -edex -close /data_store/entlightning/(\4:yyyy)(\4:mm)\4/\5/\1_\3_\4\5\6_(seq).%Y%m%d%H
|
||||
|
||||
# AWIPS1: TEXT ^[ABCFMNRSUVW]......[KPTMC] /text/NO_STORE
|
||||
# TEXT ^[ABCFMNRSUVW].....[KPTMC] /text/NO_STORE
|
||||
# TEXT ^DF.* /text/NO_STORE
|
||||
|
|
Loading…
Add table
Reference in a new issue