Merge branch 'master_14.4.1' into asm_14.4.1

Former-commit-id: 1adbe5f79d [formerly 3aa9f17455] [formerly 07c742044d] [formerly 1adbe5f79d [formerly 3aa9f17455] [formerly 07c742044d] [formerly de502a310b [formerly 07c742044d [formerly 8f839ec64da04492e6cf109fdf47b95f08db5388]]]]
Former-commit-id: de502a310b
Former-commit-id: 99a4b44c8a [formerly f075116f65] [formerly d231ab28435e2f65bc8ff6d93bb9fd5f679fa47a [formerly 7517728c42]]
Former-commit-id: 5e6472d40bbea721fe507f096045f2af8c2cb055 [formerly a3c39c1a8d]
Former-commit-id: 267fb768d9
This commit is contained in:
Fay.Liang 2015-02-03 16:04:56 -05:00
commit 7f546a3e77
210 changed files with 23780 additions and 1090 deletions

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>edu.wisc.ssec.cimss.common.dataplugin.convectprob</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,18 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: NOAA/CIMSS Prob Severe (dataplugin.convectprob)
Bundle-SymbolicName: edu.wisc.ssec.cimss.common.dataplugin.convectprob
Bundle-Version: 1.14.4.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: edu.wisc.ssec.cimss.common.dataplugin.convectprob,
edu.wisc.ssec.cimss.common.dataplugin.convectprob.impl
Require-Bundle: com.raytheon.uf.common.serialization,
com.raytheon.edex.common,
javax.persistence,
javax.measure,
com.raytheon.uf.common.dataplugin,
com.raytheon.uf.common.datastorage,
com.raytheon.uf.common.status
Import-Package: com.raytheon.uf.edex.decodertools.core,
com.raytheon.uf.edex.decodertools.time
Bundle-Vendor: CIMSS/SSEC

View file

@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.

View file

@ -0,0 +1,344 @@
package edu.wisc.ssec.cimss.common.dataplugin.convectprob;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Index;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.datastorage.records.IntegerDataRecord;
import com.raytheon.uf.common.datastorage.records.StringDataRecord;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.WKTReader;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.impl.ShapeObject;
/**
* NOAA/CIMSS Prob Severe Model Data Record Definition
*
* Data record that stores attributes of NOAA/CIMSS Prob Severe Model shapes
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 lcronce Initial Creation.
*
* </pre
*
* @author Lee Cronce
* @version 1.0
*
*/
@Entity
@SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "convectprobseq")
@Table(name = ConvectProbRecord.PLUGIN_NAME, uniqueConstraints = { @UniqueConstraint(columnNames = { "refTime" }) })
/*
* Both refTime and forecastTime are included in the refTimeIndex since
* forecastTime is unlikely to be used.
*/
@org.hibernate.annotations.Table(appliesTo = ConvectProbRecord.PLUGIN_NAME, indexes = { @Index(name = "convectprob_refTimeIndex", columnNames = {
"refTime", "forecastTime" }) })
@DynamicSerialize
public class ConvectProbRecord extends PersistablePluginDataObject implements
IPersistable {
/** Serializable id * */
private static final long serialVersionUID = 1L;
public static final String PLUGIN_NAME = "convectprob";
// Data store data item names
@Transient
private static final String[] DATA_NAMES = { "types", "probabilities", "mucapes", "ebshears", "meshes", "rcemisses", "rcicecfs", "polygons", "objectids" };
private final static transient IUFStatusHandler statusHandler = UFStatus.getHandler(ConvectProbRecord.class);
@Transient
private String[] types = null;
@Transient
private int[] probabilities = null;
@Transient
private String[] mucapes = null;
@Transient
private String[] ebshears = null;
@Transient
private String[] meshes = null;
@Transient
private String[] rcemisses = null;
@Transient
private String[] rcicecfs = null;
@Transient
private String[] polygons = null;
@Transient
private String[] objectids = null;
@Transient
private Object[] dataArrays = null;
@Transient
private int insertIndex = 0;
// Used to track
@Transient
long persistTime = 0L;
/**
* Required empty constructor.
*/
public ConvectProbRecord() {
}
/**
* Constructs a data record from a dataURI
*
* @param data URI
*/
public ConvectProbRecord(String uri) {
super(uri);
}
/**
* Constructs a convectprob record with a
* given amount of shapes
*
* @param size of arrays based on number of shapes
*/
public ConvectProbRecord(int arraysSize) {
types = new String[arraysSize];
probabilities = new int[arraysSize];
mucapes = new String[arraysSize];
ebshears = new String[arraysSize];
meshes = new String[arraysSize];
rcemisses = new String[arraysSize];
rcicecfs = new String[arraysSize];
polygons = new String[arraysSize];
objectids = new String[arraysSize];
dataArrays = new Object[] { types, probabilities, mucapes, ebshears, meshes, rcemisses, rcicecfs, polygons, objectids };
insertIndex = 0;
}
/**
* Adds a convectprob shape to the record collection.
*
* @param shape to add
*/
public void addShape(ShapeObject shape) {
try {
types[insertIndex] = shape.getType();
probabilities[insertIndex] = shape.getProbability();
mucapes[insertIndex] = shape.getMucape();
ebshears[insertIndex] = shape.getEbshear();
meshes[insertIndex] = shape.getMesh();
rcemisses[insertIndex] = shape.getRcemiss();
rcicecfs[insertIndex] = shape.getRcicecf();
polygons[insertIndex] = shape.getPolygon();
objectids[insertIndex] = shape.getObjectid();
insertIndex++;
} catch (Exception e) {
statusHandler.error("insertIndex is out of bounds: " + Integer.toString(insertIndex), e);
}
}
/**
* Retrieve names of data contained in data record
*
* @return string array of data record field names
*/
public String[] getDataNames() {
return DATA_NAMES;
}
/**
* Retrieve data contained within the data record
*
* @return array of data objects stored in record
*/
public Object[] getDataArrays() {
return dataArrays;
}
/**
* Set data to be contained within the data record
*
* @param array of data objects to be set
*/
public void setDataArrays(Object[] dataArrays) {
this.dataArrays = dataArrays;
}
/**
* Retrieves the shape types
*
* @return shape types
*/
public String[] getTypes() {
return types;
}
/**
* Retrieves the shape probabilities
*
* @return shape probabilities of severe
*/
public int[] getProbabilities() {
return probabilities;
}
/**
*Retrieves the MUCAPE associated with shapes
*
* @return shape MUCAPEs
*/
public String[] getMucapes() {
return mucapes;
}
/**
* Retrieves the EB shear associated with shapes
*
* @return shape EB Shears
*/
public String[] getEbshears() {
return ebshears;
}
/**
* Retrieves the MESH associated with the shapes
*
* @return shape MESHes
*/
public String[] getMeshes() {
return meshes;
}
/**
* Retrieves the emissivities associated with the shapes
*
* @return shape top of troposphere emissivities
*/
public String[] getRcemisses() {
return rcemisses;
}
/**
* Retrieves the ice cloud fractions associated with the shapes
*
* @return rates of change of ice cloud fraction
*/
public String[] getRcicecfs() {
return rcicecfs;
}
/**
* Retrieves the shape polygons
*
* @return polygons defining the data record shapes
*/
public String[] getPolygons() {
return polygons;
}
/**
* Retrieves the shape objectids
*
* @return objectids specifying the objectids of the shapes
*/
public String[] getObjectids() {
return objectids;
}
/**
* Creating Geometry objects from String representation
* of shape polygons
*
* @return Geometry objects of shape polygons
*/
public Geometry[] getPolyGeoms() {
Geometry[] polyGeoms = new Geometry[polygons.length];
WKTReader reader = new WKTReader();
int i = 0;
for (String poly : polygons) {
try {
polyGeoms[i] = reader.read(poly);
i++;
} catch (Exception e) {
statusHandler.error("Well Known Text reader could not read selected text: " + poly, e);
}
}
return polyGeoms;
}
/**
* Sets the data arrays from the store.
*
* @param dataStore
*/
public void retrieveFromDataStore(IDataStore dataStore) {
try {
IDataRecord[] dataRec = dataStore.retrieve(getDataURI());
dataArrays = new Object[dataRec.length];
for (int i = 0; i < dataRec.length; i++) {
if (dataRec[i].getName().equals("types")) {
types = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = types;
} else if (dataRec[i].getName().equals("probabilities")) {
probabilities = ((IntegerDataRecord) dataRec[i]).getIntData();
dataArrays[i] = probabilities;
} else if (dataRec[i].getName().equals("mucapes")) {
mucapes = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = mucapes;
} else if (dataRec[i].getName().equals("ebshears")) {
ebshears = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = ebshears;
} else if (dataRec[i].getName().equals("meshes")) {
meshes = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = meshes;
} else if (dataRec[i].getName().equals("rcemisses")) {
rcemisses = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = rcemisses;
} else if (dataRec[i].getName().equals("rcicecfs")) {
rcicecfs = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = rcicecfs;
} else if (dataRec[i].getName().equals("polygons")) {
polygons = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = polygons;
} else if (dataRec[i].getName().equals("objectids")) {
objectids = ((StringDataRecord) dataRec[i]).getStringData();
dataArrays[i] = objectids;
}
}
setDataArrays(dataArrays);
} catch (Exception e) {
statusHandler.error("Error retrieving data from the convectprob data store", e);
}
}
/**
* @see com.raytheon.uf.common.dataplugin.PluginDataObject#getPluginName()
*/
@Override
public String getPluginName() {
return PLUGIN_NAME;
}
}

View file

@ -0,0 +1,208 @@
package edu.wisc.ssec.cimss.common.dataplugin.convectprob.impl;
/**
* NOAA/CIMSS Prob Severe Model Shape Object Definition
*
* Data object that defines attributes of a NOAA/CIMSS Prob Severe Model shape
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 lcronce Initial Creation.
*
* </pre
*
* @author Lee Cronce
* @version 1.0
*
*/
public class ShapeObject {
private String type;
private int probability;
private String mucape;
private String ebshear;
private String mesh;
private String rcemiss;
private String rcicecf;
private String polygon;
private String objectid;
/**
* Default empty constructor
*/
public ShapeObject() {
}
/**
* Retrieve type of a shape
*
* @return shape type
*/
public String getType() {
return type;
}
/**
* Retrieve shape probability of severe
*
* @return shape probability of severe
*/
public int getProbability() {
return probability;
}
/**
* Retrieve MUCAPE associated with a shape
*
* @return shape MUCAPE
*/
public String getMucape() {
return mucape;
}
/**
* Retrieve EB Shear associated with a shape
*
* @return shape EB Shear
*/
public String getEbshear() {
return ebshear;
}
/**
* Retrieve MESH associated with a shape
*
* @return shape MESH
*/
public String getMesh() {
return mesh;
}
/**
* Retrieve rate of change of emissivity of a shape
*
* @return shape emissivity rate of change
*/
public String getRcemiss() {
return rcemiss;
}
/**
* Retrieve rate of change of ice cloud fraction of a shape
*
* @return shape ice cloud fraction rate of change
*/
public String getRcicecf() {
return rcicecf;
}
/**
* Retrieve the polygon defining a shape
*
* @return shape polygon
*/
public String getPolygon() {
return polygon;
}
/**
* Retried the object ID of a shape
*
* @return shape objectID
*/
public String getObjectid() {
return objectid;
}
/**
* Set type of a shape
*
* @param shape type
*/
public void setType(String type) {
this.type = type;
}
/**
* Set shape probability of severe
*
* @param shape probability of severe
*/
public void setProbability(int probability) {
this.probability = probability;
}
/**
* Set MUCAPE associated with a shape
*
* @param shape MUCAPE
*/
public void setMucape(String mucape) {
this.mucape = mucape;
}
/**
* Set EB Shear associated with a shape
*
* @param shape EB Shear
*/
public void setEbshear(String ebshear) {
this.ebshear = ebshear;
}
/**
* Set MESH associated with a shape
*
* @param shape MESH
*/
public void setMesh(String mesh) {
this.mesh = mesh;
}
/**
* Set rate of change of emissivity of a shape
*
* @param shape emissivity rate of change
*/
public void setRcemiss(String rcemiss) {
this.rcemiss = rcemiss;
}
/**
* Set rate of change of ice cloud fraction of a shape
*
* @param shape ice cloud fraction rate of change
*/
public void setRcicecf(String rcicecf) {
this.rcicecf = rcicecf;
}
/**
* Set the polygon defining a shape
*
* @param shape polygon
*/
public void setPolygon(String polygon) {
this.polygon = polygon;
}
/**
* Set the object ID of a shape
*
* @param shape objectID
*/
public void setObjectid(String objectid) {
this.objectid = objectid;
}
}

View file

@ -0,0 +1,259 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<colorMap xmlns:ns2="http://www.example.org/productType">
<color r="0.3529412" g="0.3529412" b="0.3529412" a="1.0"/>
<color r="0.35686275" g="0.35686275" b="0.35686275" a="1.0"/>
<color r="0.36078432" g="0.36078432" b="0.36078432" a="1.0"/>
<color r="0.36862746" g="0.36862746" b="0.36862746" a="1.0"/>
<color r="0.37254903" g="0.37254903" b="0.37254903" a="1.0"/>
<color r="0.3764706" g="0.3764706" b="0.3764706" a="1.0"/>
<color r="0.38039216" g="0.38039216" b="0.38039216" a="1.0"/>
<color r="0.3882353" g="0.3882353" b="0.3882353" a="1.0"/>
<color r="0.39215687" g="0.39215687" b="0.39215687" a="1.0"/>
<color r="0.39607844" g="0.39607844" b="0.39607844" a="1.0"/>
<color r="0.4" g="0.4" b="0.4" a="1.0"/>
<color r="0.40784314" g="0.40784314" b="0.40784314" a="1.0"/>
<color r="0.4117647" g="0.4117647" b="0.4117647" a="1.0"/>
<color r="0.41568628" g="0.41568628" b="0.41568628" a="1.0"/>
<color r="0.41960785" g="0.41960785" b="0.41960785" a="1.0"/>
<color r="0.42745098" g="0.42745098" b="0.42745098" a="1.0"/>
<color r="0.43137255" g="0.43137255" b="0.43137255" a="1.0"/>
<color r="0.43529412" g="0.43529412" b="0.43529412" a="1.0"/>
<color r="0.4392157" g="0.4392157" b="0.4392157" a="1.0"/>
<color r="0.44705883" g="0.44705883" b="0.44705883" a="1.0"/>
<color r="0.4509804" g="0.4509804" b="0.4509804" a="1.0"/>
<color r="0.45490196" g="0.45490196" b="0.45490196" a="1.0"/>
<color r="0.45882353" g="0.45882353" b="0.45882353" a="1.0"/>
<color r="0.4627451" g="0.4627451" b="0.4627451" a="1.0"/>
<color r="0.47058824" g="0.47058824" b="0.47058824" a="1.0"/>
<color r="0.4745098" g="0.4745098" b="0.4745098" a="1.0"/>
<color r="0.48235294" g="0.48235294" b="0.48235294" a="1.0"/>
<color r="0.4745098" g="0.47843137" b="0.49411765" a="1.0"/>
<color r="0.46666667" g="0.47843137" b="0.5019608" a="1.0"/>
<color r="0.45882353" g="0.4745098" b="0.5137255" a="1.0"/>
<color r="0.4509804" g="0.47058824" b="0.52156866" a="1.0"/>
<color r="0.44313726" g="0.46666667" b="0.53333336" a="1.0"/>
<color r="0.43529412" g="0.46666667" b="0.5411765" a="1.0"/>
<color r="0.42745098" g="0.4627451" b="0.5529412" a="1.0"/>
<color r="0.41960785" g="0.45882353" b="0.5647059" a="1.0"/>
<color r="0.4117647" g="0.45490196" b="0.57254905" a="1.0"/>
<color r="0.40392157" g="0.45490196" b="0.58431375" a="1.0"/>
<color r="0.39607844" g="0.4509804" b="0.5921569" a="1.0"/>
<color r="0.3882353" g="0.44705883" b="0.6039216" a="1.0"/>
<color r="0.38039216" g="0.44705883" b="0.6156863" a="1.0"/>
<color r="0.37254903" g="0.44313726" b="0.62352943" a="1.0"/>
<color r="0.3647059" g="0.4392157" b="0.63529414" a="1.0"/>
<color r="0.35686275" g="0.43529412" b="0.6431373" a="1.0"/>
<color r="0.34901962" g="0.43529412" b="0.654902" a="1.0"/>
<color r="0.34117648" g="0.43137255" b="0.6627451" a="1.0"/>
<color r="0.33333334" g="0.42745098" b="0.6745098" a="1.0"/>
<color r="0.3254902" g="0.42352942" b="0.6862745" a="1.0"/>
<color r="0.31764707" g="0.42352942" b="0.69411767" a="1.0"/>
<color r="0.30980393" g="0.41960785" b="0.7058824" a="1.0"/>
<color r="0.3019608" g="0.41568628" b="0.7137255" a="1.0"/>
<color r="0.29411766" g="0.41568628" b="0.7254902" a="1.0"/>
<color r="0.28627452" g="0.4117647" b="0.7372549" a="1.0"/>
<color r="0.2784314" g="0.40784314" b="0.74509805" a="1.0"/>
<color r="0.27058825" g="0.40392157" b="0.75686276" a="1.0"/>
<color r="0.2627451" g="0.40392157" b="0.7647059" a="1.0"/>
<color r="0.25490198" g="0.4" b="0.7764706" a="1.0"/>
<color r="0.24705882" g="0.39607844" b="0.78431374" a="1.0"/>
<color r="0.23921569" g="0.39215687" b="0.79607844" a="1.0"/>
<color r="0.23137255" g="0.39215687" b="0.80784315" a="1.0"/>
<color r="0.22352941" g="0.3882353" b="0.8156863" a="1.0"/>
<color r="0.21568628" g="0.38431373" b="0.827451" a="1.0"/>
<color r="0.20784314" g="0.38039216" b="0.8352941" a="1.0"/>
<color r="0.2" g="0.38039216" b="0.84705883" a="1.0"/>
<color r="0.19215687" g="0.3764706" b="0.85882354" a="1.0"/>
<color r="0.18431373" g="0.37254903" b="0.8666667" a="1.0"/>
<color r="0.1764706" g="0.37254903" b="0.8784314" a="1.0"/>
<color r="0.16862746" g="0.36862746" b="0.8862745" a="1.0"/>
<color r="0.16078432" g="0.3647059" b="0.8980392" a="1.0"/>
<color r="0.15294118" g="0.36078432" b="0.90588236" a="1.0"/>
<color r="0.14509805" g="0.36078432" b="0.91764706" a="1.0"/>
<color r="0.13725491" g="0.35686275" b="0.92941177" a="1.0"/>
<color r="0.12941177" g="0.3529412" b="0.9372549" a="1.0"/>
<color r="0.12156863" g="0.34901962" b="0.9490196" a="1.0"/>
<color r="0.11372549" g="0.34901962" b="0.95686275" a="1.0"/>
<color r="0.105882354" g="0.34509805" b="0.96862745" a="1.0"/>
<color r="0.09803922" g="0.34117648" b="0.9764706" a="1.0"/>
<color r="0.09019608" g="0.34117648" b="0.9882353" a="1.0"/>
<color r="0.078431375" g="0.33333334" b="0.99607843" a="1.0"/>
<color r="0.09411765" g="0.34509805" b="0.99607843" a="1.0"/>
<color r="0.105882354" g="0.35686275" b="0.99607843" a="1.0"/>
<color r="0.12156863" g="0.37254903" b="0.99607843" a="1.0"/>
<color r="0.13333334" g="0.38431373" b="0.99215686" a="1.0"/>
<color r="0.14901961" g="0.39607844" b="0.99215686" a="1.0"/>
<color r="0.16078432" g="0.40784314" b="0.99215686" a="1.0"/>
<color r="0.1764706" g="0.41960785" b="0.99215686" a="1.0"/>
<color r="0.1882353" g="0.43137255" b="0.99215686" a="1.0"/>
<color r="0.20392157" g="0.44705883" b="0.99215686" a="1.0"/>
<color r="0.21568628" g="0.45882353" b="0.9882353" a="1.0"/>
<color r="0.23137255" g="0.47058824" b="0.9882353" a="1.0"/>
<color r="0.24705882" g="0.48235294" b="0.9882353" a="1.0"/>
<color r="0.25882354" g="0.49411765" b="0.9882353" a="1.0"/>
<color r="0.27450982" g="0.5058824" b="0.9882353" a="1.0"/>
<color r="0.28627452" g="0.52156866" b="0.9882353" a="1.0"/>
<color r="0.3019608" g="0.53333336" b="0.9843137" a="1.0"/>
<color r="0.3137255" g="0.54509807" b="0.9843137" a="1.0"/>
<color r="0.32941177" g="0.5568628" b="0.9843137" a="1.0"/>
<color r="0.34117648" g="0.5686275" b="0.9843137" a="1.0"/>
<color r="0.35686275" g="0.5803922" b="0.9843137" a="1.0"/>
<color r="0.36862746" g="0.59607846" b="0.9843137" a="1.0"/>
<color r="0.38431373" g="0.60784316" b="0.9843137" a="1.0"/>
<color r="0.4" g="0.61960787" b="0.98039216" a="1.0"/>
<color r="0.4117647" g="0.6313726" b="0.98039216" a="1.0"/>
<color r="0.42745098" g="0.6431373" b="0.98039216" a="1.0"/>
<color r="0.4392157" g="0.654902" b="0.98039216" a="1.0"/>
<color r="0.45490196" g="0.67058825" b="0.98039216" a="1.0"/>
<color r="0.46666667" g="0.68235296" b="0.98039216" a="1.0"/>
<color r="0.48235294" g="0.69411767" b="0.9764706" a="1.0"/>
<color r="0.49411765" g="0.7058824" b="0.9764706" a="1.0"/>
<color r="0.50980395" g="0.7176471" b="0.9764706" a="1.0"/>
<color r="0.5254902" g="0.73333335" b="0.9764706" a="1.0"/>
<color r="0.5372549" g="0.74509805" b="0.9764706" a="1.0"/>
<color r="0.5529412" g="0.75686276" b="0.9764706" a="1.0"/>
<color r="0.5647059" g="0.76862746" b="0.972549" a="1.0"/>
<color r="0.5803922" g="0.78039217" b="0.972549" a="1.0"/>
<color r="0.5921569" g="0.7921569" b="0.972549" a="1.0"/>
<color r="0.60784316" g="0.80784315" b="0.972549" a="1.0"/>
<color r="0.61960787" g="0.81960785" b="0.972549" a="1.0"/>
<color r="0.63529414" g="0.83137256" b="0.972549" a="1.0"/>
<color r="0.64705884" g="0.84313726" b="0.972549" a="1.0"/>
<color r="0.6627451" g="0.85490197" b="0.96862745" a="1.0"/>
<color r="0.6784314" g="0.8666667" b="0.96862745" a="1.0"/>
<color r="0.6901961" g="0.88235295" b="0.96862745" a="1.0"/>
<color r="0.7058824" g="0.89411765" b="0.96862745" a="1.0"/>
<color r="0.7176471" g="0.90588236" b="0.96862745" a="1.0"/>
<color r="0.73333335" g="0.91764706" b="0.96862745" a="1.0"/>
<color r="0.74509805" g="0.92941177" b="0.9647059" a="1.0"/>
<color r="0.7607843" g="0.9411765" b="0.9647059" a="1.0"/>
<color r="0.77254903" g="0.95686275" b="0.9647059" a="1.0"/>
<color r="0.78431374" g="0.9647059" b="0.9647059" a="1.0"/>
<color r="0.7882353" g="0.95686275" b="0.9647059" a="1.0"/>
<color r="0.7882353" g="0.94509804" b="0.9647059" a="1.0"/>
<color r="0.7921569" g="0.9372549" b="0.9647059" a="1.0"/>
<color r="0.7921569" g="0.9254902" b="0.9647059" a="1.0"/>
<color r="0.79607844" g="0.91764706" b="0.9647059" a="1.0"/>
<color r="0.79607844" g="0.90588236" b="0.9647059" a="1.0"/>
<color r="0.8" g="0.8980392" b="0.9647059" a="1.0"/>
<color r="0.8" g="0.8901961" b="0.9647059" a="1.0"/>
<color r="0.8039216" g="0.8784314" b="0.9647059" a="1.0"/>
<color r="0.8039216" g="0.87058824" b="0.9647059" a="1.0"/>
<color r="0.80784315" g="0.85882354" b="0.96862745" a="1.0"/>
<color r="0.8117647" g="0.8509804" b="0.96862745" a="1.0"/>
<color r="0.8117647" g="0.8392157" b="0.96862745" a="1.0"/>
<color r="0.8156863" g="0.83137256" b="0.96862745" a="1.0"/>
<color r="0.8156863" g="0.8235294" b="0.96862745" a="1.0"/>
<color r="0.81960785" g="0.8117647" b="0.96862745" a="1.0"/>
<color r="0.81960785" g="0.8039216" b="0.96862745" a="1.0"/>
<color r="0.8235294" g="0.7921569" b="0.96862745" a="1.0"/>
<color r="0.8235294" g="0.78431374" b="0.96862745" a="1.0"/>
<color r="0.827451" g="0.7764706" b="0.96862745" a="1.0"/>
<color r="0.827451" g="0.7647059" b="0.96862745" a="1.0"/>
<color r="0.83137256" g="0.75686276" b="0.96862745" a="1.0"/>
<color r="0.83137256" g="0.74509805" b="0.96862745" a="1.0"/>
<color r="0.8352941" g="0.7372549" b="0.96862745" a="1.0"/>
<color r="0.8392157" g="0.7254902" b="0.96862745" a="1.0"/>
<color r="0.8392157" g="0.7176471" b="0.96862745" a="1.0"/>
<color r="0.84313726" g="0.70980394" b="0.96862745" a="1.0"/>
<color r="0.84313726" g="0.69803923" b="0.96862745" a="1.0"/>
<color r="0.84705883" g="0.6901961" b="0.96862745" a="1.0"/>
<color r="0.84705883" g="0.6784314" b="0.96862745" a="1.0"/>
<color r="0.8509804" g="0.67058825" b="0.972549" a="1.0"/>
<color r="0.8509804" g="0.65882355" b="0.972549" a="1.0"/>
<color r="0.85490197" g="0.6509804" b="0.972549" a="1.0"/>
<color r="0.85490197" g="0.6431373" b="0.972549" a="1.0"/>
<color r="0.85882354" g="0.6313726" b="0.972549" a="1.0"/>
<color r="0.8627451" g="0.62352943" b="0.972549" a="1.0"/>
<color r="0.8627451" g="0.6117647" b="0.972549" a="1.0"/>
<color r="0.8666667" g="0.6039216" b="0.972549" a="1.0"/>
<color r="0.8666667" g="0.5921569" b="0.972549" a="1.0"/>
<color r="0.87058824" g="0.58431375" b="0.972549" a="1.0"/>
<color r="0.87058824" g="0.5764706" b="0.972549" a="1.0"/>
<color r="0.8745098" g="0.5647059" b="0.972549" a="1.0"/>
<color r="0.8745098" g="0.5568628" b="0.972549" a="1.0"/>
<color r="0.8784314" g="0.54509807" b="0.972549" a="1.0"/>
<color r="0.8784314" g="0.5372549" b="0.972549" a="1.0"/>
<color r="0.88235295" g="0.5294118" b="0.972549" a="1.0"/>
<color r="0.88235295" g="0.5176471" b="0.972549" a="1.0"/>
<color r="0.8862745" g="0.50980395" b="0.972549" a="1.0"/>
<color r="0.8901961" g="0.49803922" b="0.972549" a="1.0"/>
<color r="0.8901961" g="0.49019608" b="0.972549" a="1.0"/>
<color r="0.89411765" g="0.47843137" b="0.9764706" a="1.0"/>
<color r="0.89411765" g="0.47058824" b="0.9764706" a="1.0"/>
<color r="0.8980392" g="0.4627451" b="0.9764706" a="1.0"/>
<color r="0.8980392" g="0.4509804" b="0.9764706" a="1.0"/>
<color r="0.9019608" g="0.44313726" b="0.9764706" a="1.0"/>
<color r="0.9019608" g="0.43137255" b="0.9764706" a="1.0"/>
<color r="0.90588236" g="0.42352942" b="0.9764706" a="1.0"/>
<color r="0.90588236" g="0.4117647" b="0.9764706" a="1.0"/>
<color r="0.9098039" g="0.40392157" b="0.9764706" a="1.0"/>
<color r="0.9137255" g="0.39607844" b="0.9764706" a="1.0"/>
<color r="0.9137255" g="0.38431373" b="0.9764706" a="1.0"/>
<color r="0.91764706" g="0.3764706" b="0.9764706" a="1.0"/>
<color r="0.91764706" g="0.3647059" b="0.9764706" a="1.0"/>
<color r="0.92156863" g="0.35686275" b="0.9764706" a="1.0"/>
<color r="0.92156863" g="0.34509805" b="0.9764706" a="1.0"/>
<color r="0.9254902" g="0.3372549" b="0.9764706" a="1.0"/>
<color r="0.9254902" g="0.32941177" b="0.9764706" a="1.0"/>
<color r="0.92941177" g="0.31764707" b="0.9764706" a="1.0"/>
<color r="0.92941177" g="0.30980393" b="0.9764706" a="1.0"/>
<color r="0.93333334" g="0.29803923" b="0.9764706" a="1.0"/>
<color r="0.93333334" g="0.2901961" b="0.9764706" a="1.0"/>
<color r="0.9372549" g="0.2784314" b="0.98039216" a="1.0"/>
<color r="0.9411765" g="0.27058825" b="0.98039216" a="1.0"/>
<color r="0.9411765" g="0.2627451" b="0.98039216" a="1.0"/>
<color r="0.94509804" g="0.2509804" b="0.98039216" a="1.0"/>
<color r="0.94509804" g="0.24313726" b="0.98039216" a="1.0"/>
<color r="0.9490196" g="0.23137255" b="0.98039216" a="1.0"/>
<color r="0.9490196" g="0.22352941" b="0.98039216" a="1.0"/>
<color r="0.9529412" g="0.21568628" b="0.98039216" a="1.0"/>
<color r="0.9529412" g="0.20392157" b="0.98039216" a="1.0"/>
<color r="0.95686275" g="0.19607843" b="0.98039216" a="1.0"/>
<color r="0.95686275" g="0.18431373" b="0.98039216" a="1.0"/>
<color r="0.9607843" g="0.1764706" b="0.98039216" a="1.0"/>
<color r="0.9647059" g="0.16470589" b="0.98039216" a="1.0"/>
<color r="0.9647059" g="0.15686275" b="0.98039216" a="1.0"/>
<color r="0.96862745" g="0.14901961" b="0.98039216" a="1.0"/>
<color r="0.96862745" g="0.13725491" b="0.98039216" a="1.0"/>
<color r="0.972549" g="0.12941177" b="0.98039216" a="1.0"/>
<color r="0.972549" g="0.11764706" b="0.98039216" a="1.0"/>
<color r="0.9764706" g="0.10980392" b="0.98039216" a="1.0"/>
<color r="0.9764706" g="0.09803922" b="0.98039216" a="1.0"/>
<color r="0.98039216" g="0.09019608" b="0.9843137" a="1.0"/>
<color r="0.98039216" g="0.08235294" b="0.9843137" a="1.0"/>
<color r="0.9843137" g="0.07058824" b="0.9843137" a="1.0"/>
<color r="0.9843137" g="0.0627451" b="0.9843137" a="1.0"/>
<color r="0.9882353" g="0.050980393" b="0.9843137" a="1.0"/>
<color r="0.99215686" g="0.043137256" b="0.9843137" a="1.0"/>
<color r="0.99215686" g="0.03137255" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.023529412" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.015686275" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.003921569" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.0" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.019607844" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.019607844" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.019607844" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.019607844" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.015686275" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.015686275" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.015686275" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.015686275" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.015686275" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.011764706" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.011764706" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.011764706" b="0.9843137" a="1.0"/>
<color r="0.99607843" g="0.011764706" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.011764706" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.007843138" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.007843138" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.007843138" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.007843138" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.003921569" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.003921569" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.003921569" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.003921569" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.003921569" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.0" b="0.9843137" a="1.0"/>
<color r="1.0" g="0.0" b="0.9843137" a="1.0"/>
</colorMap>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>edu.wisc.ssec.cimss.edex.convectprob.feature</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.pde.FeatureBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.FeatureNature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1 @@
bin.includes = feature.xml

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="edu.wisc.ssec.cimss.edex.convectprob.feature"
label="Convectprob EDEX Feature"
version="1.0.0.qualifier"
provider-name="CIMSS/SSEC">
<description url="http://www.example.com/description">
[Enter Feature Description here.]
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<plugin
id="edu.wisc.ssec.cimss.common.dataplugin.convectprob"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="edu.wisc.ssec.cimss.edex.plugin.convectprob"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="src" path="/com.raytheon.edex.common"/>
<classpathentry kind="src" path="/edu.wisc.ssec.cimss.common.dataplugin.convectprob"/>
<classpathentry kind="src" path="/com.raytheon.uf.common.dataplugin"/>
<classpathentry kind="src" path="/com.raytheon.uf.common.time"/>
<classpathentry kind="src" path="/org.geotools"/>
<classpathentry combineaccessrules="false" kind="src" path="/com.raytheon.uf.edex.core"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>edu.wisc.ssec.cimss.edex.plugin.convectprob</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,16 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: NOAA/CIMSS Prob Severe (plugin.convectprob)
Bundle-SymbolicName: edu.wisc.ssec.cimss.edex.plugin.convectprob
Bundle-Version: 1.14.4.qualifier
Bundle-Vendor: CIMSS/SSEC
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: com.raytheon.uf.edex.decodertools;bundle-version="1.0.0",
javax.persistence,
com.raytheon.uf.common.status;bundle-version="1.12.1174"
Import-Package: com.raytheon.uf.common.datastorage,
com.raytheon.uf.common.datastorage.records,
com.raytheon.uf.edex.database.plugin,
edu.wisc.ssec.cimss.common.dataplugin.convectprob,
edu.wisc.ssec.cimss.common.dataplugin.convectprob.impl

View file

@ -0,0 +1,5 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
res/

View file

@ -0,0 +1,22 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="convectprobPluginName" class="java.lang.String">
<constructor-arg type="java.lang.String" value="convectprob" />
</bean>
<bean id="convectprobProperties" class="com.raytheon.uf.common.dataplugin.PluginProperties"
depends-on="convectprobPluginName">
<property name="pluginName" ref="convectprobPluginName" />
<property name="pluginFQN" value="edu.wisc.ssec.cimss.common.dataplugin.convectprob" />
<property name="dao" value="edu.wisc.ssec.cimss.edex.plugin.convectprob.dao.ConvectProbDao" />
<property name="record" value="edu.wisc.ssec.cimss.common.dataplugin.convectprob.ConvectProbRecord" />
</bean>
<bean id="convectprobRegistered" factory-bean="pluginRegistry" factory-method="register">
<constructor-arg value="convectprob"/>
<constructor-arg ref="convectprobProperties"/>
</bean>
</beans>

View file

@ -0,0 +1,39 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="convectprobDecoder"
class="edu.wisc.ssec.cimss.edex.plugin.convectprob.ConvectProbDecoder" />
<bean id="convectprobDistRegistry" factory-bean="distributionSrv"
factory-method="register">
<constructor-arg value="convectprob" />
<constructor-arg value="jms-durable:queue:Ingest.convectprob"/>
</bean>
<camelContext id="convectprob-camel"
xmlns="http://camel.apache.org/schema/spring"
errorHandlerRef="errorHandler"
autoStartup="false">
<!-- Begin convectprob routes -->
<route id="convectprobIngestRoute">
<from uri="jms-durable:queue:Ingest.convectprob"/>
<setHeader headerName="pluginName">
<constant>convectprob</constant>
</setHeader>
<doTry>
<pipeline>
<bean ref="stringToFile" />
<bean ref="convectprobDecoder" method="decode" />
<to uri="direct-vm:persistIndexAlert" />
</pipeline>
<doCatch>
<exception>java.lang.Throwable</exception>
<to uri="log:convectprob?level=ERROR"/>
</doCatch>
</doTry>
</route>
</camelContext>
</beans>

View file

@ -0,0 +1,115 @@
package edu.wisc.ssec.cimss.edex.plugin.convectprob;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import com.raytheon.edex.plugin.AbstractDecoder;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.util.TimeUtil;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.ConvectProbRecord;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.impl.ShapeObject;
import edu.wisc.ssec.cimss.edex.plugin.convectprob.impl.ConvectProbParser;
/**
* NOAA/CIMSS Prob Severe Model Data Decoder
*
* Data decoder that reads shapefile records of NOAA/CIMSS Prob Severe Model
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 lcronce Initial Creation.
*
* </pre
*
* @author Lee Cronce
* @version 1.0
*
*/
public class ConvectProbDecoder extends AbstractDecoder {
private final IUFStatusHandler statusHandler = UFStatus.getHandler(ConvectProbDecoder.class);
private String traceId = null;
/**
* Default empty constructor
*/
public ConvectProbDecoder() {
}
/**
* Creates the data object that will be persisted to the database and
* hdf5 repository
*
* @param File object passed by EDEX
* @return PluginDataObject[] object of shape data
* @throws Throwable
*/
public PluginDataObject[] decode(File file) throws Throwable {
ArrayList<ShapeObject> shapes = new ArrayList<ShapeObject>();
ConvectProbParser parser = new ConvectProbParser(file);
ShapeObject token;
while (parser.hasNext()) {
token = parser.next();
try {
if (token != null) {
shapes.add(token);
}
} catch (Exception e) {
statusHandler.error("Problem creating new convectprob object from file" + file.getName(), e);
return new PluginDataObject[0];
}
}
ConvectProbRecord record = null;
if (shapes.size() > 0) {
record = new ConvectProbRecord(shapes.size());
for (ShapeObject shape : shapes) {
record.addShape(shape);
}
} else {
return new PluginDataObject[0];
}
String validTime = parser.getValidTime();
if (validTime != null) {
Calendar c = TimeUtil.newCalendar();
record.setInsertTime(c);
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
record.setDataTime(new DataTime(dateFormat.parse(validTime)));
} catch (Exception e) {
statusHandler.error("Problem defining valid convectprob file time information using: " + validTime, e);
return new PluginDataObject[0];
}
} else {
return new PluginDataObject[0];
}
if (record != null) {
record.setTraceId(traceId);
}
return new PluginDataObject[] { record };
}
/**
* Set a trace identifier for the source data.
*
* @param traceId
* A unique identifier associated with the input data.
*/
public void setTraceId(String traceId) {
this.traceId = traceId;
}
}

View file

@ -0,0 +1,60 @@
package edu.wisc.ssec.cimss.edex.plugin.convectprob.dao;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.ConvectProbRecord;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
import com.raytheon.uf.common.datastorage.DataStoreFactory;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.edex.database.plugin.PluginDao;
/**
* NOAA/CIMSS Prob Severe Model Data Acquisition Object
*
* Defines access to persisted data from NOAA/CIMSS Prob Severe Model
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 jgerth Initial Creation.
*
* </pre
*
* @author Jordan Gerth
* @version 1.0
*
*/
public class ConvectProbDao extends PluginDao {
/**
* ConvectProbDao constructor
* @param Plugin name
* @throws PluginException
*/
public ConvectProbDao(String pluginName) throws PluginException {
super(pluginName);
}
/**
* Copy data from a Persistable object into a given DataStore container.
* @param dataStore DataStore instance to receive the Persistable data.
* @param obj The Persistable object to be stored.
* @throws Exception Any general exception thrown in this method.
*/
protected IDataStore populateDataStore(IDataStore dataStore,
IPersistable obj) throws Exception {
ConvectProbRecord cpRec = (ConvectProbRecord) obj;
for (int i = 0; i < cpRec.getDataArrays().length; i++) {
IDataRecord record = DataStoreFactory.createStorageRecord(
cpRec.getDataNames()[i], cpRec.getDataURI(), cpRec.getDataArrays()[i]);
record.setCorrelationObject(cpRec);
dataStore.addDataRecord(record);
}
return dataStore;
}
}

View file

@ -0,0 +1,242 @@
package edu.wisc.ssec.cimss.edex.plugin.convectprob.impl;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.impl.ShapeObject;
/**
* NOAA/CIMSS Prob Severe Model Data Parser
*
* Data parser that parses shapefile records of NOAA/CIMSS Prob Severe Model
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 lcronce Initial Creation.
*
* </pre
*
* @author Lee Cronce
* @version 1.0
*
*/
public class ConvectProbParser {
private final IUFStatusHandler statusHandler = UFStatus.getHandler(ConvectProbParser.class);
int currentShape = -1;
private List<ShapeObject> shapes;
private String validTime;
private List<String> fileLines;
/**
* Default empty constructor
*/
public ConvectProbParser() {
}
/**
* Calls setData method for defining shape data
*
* @param File object passed on from EDEX
*/
public ConvectProbParser(File file) {
setData(file);
}
/**
* Calls findShapes method to define shape data
*
* @param File object passed on from EDEX
*/
private void setData(File file) {
currentShape = -1;
fileLines = separateLines(file);
validTime = findTime(fileLines, file);
shapes = findShapes(fileLines);
if((shapes != null) && (shapes.size() > 0)) {
currentShape = 0;
}
}
/**
* Returns convectprob data file valid time reference
*
* @return String object defining valid time reference
*/
public String getValidTime() {
return validTime;
}
/**
* Determines if parser contains any more reports
*
* @return Boolean object defining "Does this parser contain any more reports?"
*/
public boolean hasNext() {
boolean next = (shapes != null);
if(next) {
next = ((currentShape >= 0) && (currentShape < shapes.size()));
}
if(!next) {
shapes = null;
currentShape = -1;
}
return next;
}
/**
* Gets the next available report and returns a null reference if no
* more reports are available.
*
* @return Next available shape object
*/
public ShapeObject next() {
ShapeObject shape = null;
if(currentShape < 0) {
return shape;
}
if(currentShape >= shapes.size()) {
shapes = null;
currentShape = -1;
} else {
shape = shapes.get(currentShape++);
}
return shape;
}
/**
* Parses out the data from the passed file object
*
* @param ArrayList of String type containing individual lines of a convectprob data file
* @return String object containing convectprob data valid time
*/
private String findTime(List<String> fileLines, File file) {
String validTime = null;
if (fileLines != null) {
try {
String vTime = fileLines.get(0);
if (!vTime.substring(0,5).equals("Valid")) {
if (file.getName().substring(0,4).equals("SSEC")) {
validTime = file.getName().substring(23,38);
} else {
validTime = null;
}
} else{
validTime = vTime.split(" ")[1];
}
} catch (Exception e) {
statusHandler.error("Problem acquiring convectprob data valid date and time", e);
}
}
return validTime;
}
/**
* Parses out the data from the passed file object
*
* @param File object passed on from EDEX
* @return ArrayList containing the shape data
*/
private List<ShapeObject> findShapes(List<String> fileLines) {
List<ShapeObject> shapes = new ArrayList<ShapeObject>();
if (fileLines != null) {
for (String line : fileLines) {
if (!line.substring(0,5).equals("Valid")) {
try {
ShapeObject shape = new ShapeObject();
String[] shapeAttributes = line.split(":");
String type = shapeAttributes[0];
shape.setType(type);
int probability = Integer.parseInt(shapeAttributes[1].replaceAll("\\D", ""));
shape.setProbability(probability);
String mucape = shapeAttributes[2];
shape.setMucape(mucape);
String ebshear = shapeAttributes[3];
shape.setEbshear(ebshear);
String mesh = shapeAttributes[4];
shape.setMesh(mesh);
String rcemiss = shapeAttributes[5];
shape.setRcemiss(rcemiss);
String rcicecf = shapeAttributes[6];
shape.setRcicecf(rcicecf);
String[] points = shapeAttributes[7].split(",");
float[] latitudes = new float[points.length/2];
float[] longitudes = new float[points.length/2];
for (int i=0; i < points.length; i++) {
if ((i == 0) || ((i%2) == 0)) {
latitudes[i/2] = Float.parseFloat(points[i]);
} else {
longitudes[(i-1)/2] = Float.parseFloat(points[i]);
}
}
StringBuffer strbuf = new StringBuffer();
strbuf.append("POLYGON((");
for (int j=0; j < latitudes.length; j++) {
strbuf.append(Float.toString(longitudes[j]));
strbuf.append(" ");
strbuf.append(Float.toString(latitudes[j]));
if (j < latitudes.length-1) {
strbuf.append(",");
strbuf.append(" ");
}
}
strbuf.append("))");
shape.setPolygon(strbuf.toString());
String objectid = shapeAttributes[8];
shape.setObjectid(objectid);
if (latitudes.length >= 4 || longitudes.length >= 4) {
shapes.add(shape);
}
} catch (Exception e) {
statusHandler.error("Problem defining convectprob shape object from read line: " + line, e);
}
}
}
}
return shapes;
}
/**
* Separates out lines of data from the input data file
*
* @param File passed on by EDEX
* @return ArrayList of lines of data from data file
*/
private List<String> separateLines(File file) {
List<String> fileLines = null;
try {
if (file != null) {
BufferedReader reader = new BufferedReader(new FileReader(file));
fileLines = new ArrayList<String>();
String line;
while ((line = reader.readLine()) != null) {
fileLines.add(line);
}
reader.close();
}
} catch (Exception e) {
statusHandler.error("Problem with reading lines of the convectprob input file: " + file.getName(), e);
}
return fileLines;
}
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purgeRuleSet>
<defaultRule>
<versionsToKeep>60</versionsToKeep>
</defaultRule>
</purgeRuleSet>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
This_software_was_developed_and_/_or_modified_by_Raytheon_Company,
pursuant_to_Contract_DG133W-05-CQ-1067_with_the_US_Government.
U.S._EXPORT_CONTROLLED_TECHNICAL_DATA
This_software_product_contains_export-restricted_data_whose
export/transfer/disclosure_is_restricted_by_U.S._law._Dissemination
to_non-U.S._persons_whether_in_the_United_States_or_abroad_requires
an_export_license_or_other_authorization.
Contractor_Name:________Raytheon_Company
Contractor_Address:_____6825_Pine_Street,_Suite_340
________________________Mail_Stop_B8
________________________Omaha,_NE_68106
________________________402.291.0100
See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for
further_licensing_information.
-->
<requestPatterns xmlns:ns2="group">
<regex>^SSEC_AWIPS_CONVECTPROB_*</regex>
</requestPatterns>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>edu.wisc.ssec.cimss.viz.convectprob.feature</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.pde.FeatureBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.FeatureNature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1 @@
bin.includes = feature.xml

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="edu.wisc.ssec.cimss.viz.convectprob.feature"
label="Convectprob CAVE Feature"
version="1.0.0.qualifier"
provider-name="CIMSS/SSEC">
<description url="http://www.example.com/description">
[Enter Feature Description here.]
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<requires>
<import feature="com.raytheon.uf.viz.common.core.feature" version="1.0.0.qualifier"/>
<import feature="com.raytheon.uf.viz.core.feature" version="1.0.0.qualifier"/>
<import feature="com.raytheon.uf.viz.cots.feature" version="1.0.0.qualifier"/>
<import feature="com.raytheon.uf.viz.d2d.core.feature" version="1.0.0.qualifier"/>
</requires>
<plugin
id="edu.wisc.ssec.cimss.common.dataplugin.convectprob"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="edu.wisc.ssec.cimss.viz.convectprob"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>edu.wisc.ssec.cimss.viz.convectprob</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,39 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: NOAA/CIMSS Prob Severe (viz.convectprob)
Bundle-SymbolicName: edu.wisc.ssec.cimss.viz.convectprob;singleton:=true
Bundle-Version: 1.14.4.qualifier
Require-Bundle: org.eclipse.ui,
org.geotools,
com.raytheon.uf.common.datastorage,
com.raytheon.uf.viz.core,
edu.wisc.ssec.cimss.common.dataplugin.convectprob
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: com.raytheon.uf.common.colormap,
com.raytheon.uf.common.colormap.prefs,
com.raytheon.uf.common.dataplugin,
com.raytheon.uf.common.geospatial,
com.raytheon.uf.common.status,
com.raytheon.uf.common.time,
com.raytheon.uf.viz.core,
com.raytheon.uf.viz.core.drawables,
com.raytheon.uf.viz.core.exception,
com.raytheon.uf.viz.core.map,
com.raytheon.uf.viz.core.procedures,
com.raytheon.uf.viz.core.rsc,
com.raytheon.uf.viz.core.rsc.capabilities,
com.raytheon.uf.viz.core.status,
com.raytheon.uf.viz.d2d.core,
com.raytheon.uf.viz.productbrowser,
com.raytheon.viz.ui,
com.raytheon.viz.ui.editor,
com.vividsolutions.jts.geom,
org.eclipse.core.runtime,
org.eclipse.swt.graphics,
org.eclipse.ui.plugin,
org.opengis.referencing.crs,
org.osgi.framework
Export-Package: edu.wisc.ssec.cimss.viz.convectprob,
edu.wisc.ssec.cimss.viz.convectprob.rsc
Bundle-Vendor: CIMSS/SSEC

View file

@ -0,0 +1,6 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
localization/

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
Affiliate_Name:________Cooperative Institute for Meteorological Satellite Studies
Affiliate_Address:_____1225 W. Dayton St.
_______________________Madison, WI 53706
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties loadWithoutData="false">
<capabilities>
<capability xsi:type="colorMapCapability">
<colorMapParameters colorMapName="prob_severe"/>
</capability>
<capability xsi:type="colorableCapability" colorAsString="#FFFFFF"/>
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="false" isHoverOn="false" isVisible="true">
</properties>
<resourceData xsi:type="convectProbResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true" retrieveData="true"
showObjectId="false">
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="convectprob" constraintType="EQUALS"/>
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<?eclipse version="3.2"?>
<plugin>
<extension
point="com.raytheon.uf.viz.core.resource">
<resource
class="edu.wisc.ssec.cimss.viz.convectprob.rsc.ConvectProbResource"
name="ConvectProb"
recordClass="edu.wisc.ssec.cimss.common.dataplugin.convectprob.ConvectProbRecord"
renderingOrderId="PLOT"
resourceType="PLAN_VIEW"/>
</extension>
<extension
point="com.raytheon.uf.viz.productbrowser.dataDefinition">
<dataDefinition
name="convectProbProductBrowserDataDefinition"
class="edu.wisc.ssec.cimss.viz.convectprob.ConvectProbProductBrowserDataDefinition" >
</dataDefinition>
</extension>
</plugin>

View file

@ -0,0 +1,102 @@
package edu.wisc.ssec.cimss.viz.convectprob;
import java.util.ArrayList;
import java.util.List;
import com.raytheon.viz.ui.BundleProductLoader;
import com.raytheon.viz.ui.EditorUtil;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.procedures.Bundle;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.ResourceType;
import com.raytheon.uf.viz.productbrowser.AbstractProductBrowserDataDefinition;
import com.raytheon.uf.viz.productbrowser.ProductBrowserLabel;
import com.raytheon.uf.viz.productbrowser.ProductBrowserPreference;
import edu.wisc.ssec.cimss.viz.convectprob.rsc.ConvectProbResourceData;
/**
* NOAA/CIMSS Prob Severe Model Product Browser Data Definition
*
* Defines product browser access to NOAA/CIMSS Prob Severe Model data
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 jgerth Initial Creation.
*
* </pre
*
* @author Jordan Gerth
* @version 1.0
*
*/
public class ConvectProbProductBrowserDataDefinition extends
AbstractProductBrowserDataDefinition<ConvectProbResourceData> {
IUFStatusHandler statusHandler = UFStatus.getHandler(ConvectProbProductBrowserDataDefinition.class);
/**
* Constructor defining new instance of this class
*/
public ConvectProbProductBrowserDataDefinition() {
displayName = "Prob Severe";
loadProperties = new LoadProperties();
}
/**
* @see com.raytheon.uf.viz.productbrowser.AbstractProductBrowserDataDefinition#getResourceData()
*/
@Override
public ConvectProbResourceData getResourceData() {
return new ConvectProbResourceData();
}
/**
* @see com.raytheon.uf.viz.productbrowser.AbstractProductBrowserDataDefinition#populateData(java.lang.String[])
*/
@Override
public List<ProductBrowserLabel> populateData(String[] selection) {
List<ProductBrowserLabel> labels = new ArrayList<ProductBrowserLabel>();
ProductBrowserLabel label = new ProductBrowserLabel("NOAA/CIMSS Prob Severe Model", "Probability of Severe");
label.setProduct(true);
labels.add(label);
return labels;
}
/**
* @see com.raytheon.uf.viz.productbrowser.AbstractProductBrowserDataDefinition#buildProductList(java.util.List)
*/
@Override
public List<String> buildProductList(List<String> historyList) {
return historyList;
}
/**
* @see com.raytheon.uf.viz.productbrowser.AbstractProductBrowserDataDefinition#constructResource(java.lang.String[], com.raytheon.uf.viz.core.rsc.ResourceType)
*/
@Override
public void constructResource(String[] selection, ResourceType type) {
try {
Bundle b = Bundle.unmarshalBundle(PathManagerFactory.getPathManager().getStaticFile("bundles/ConvectProb.xml"));
new BundleProductLoader(EditorUtil.getActiveVizContainer(),b).run();
} catch (VizException e1) {
statusHandler.handle(Priority.PROBLEM, "Could not create resource for NOAA/CIMSS Prob Severe Model data", e1);
}
}
/**
* @see com.raytheon.uf.viz.productbrowser.AbstractProductBrowserDataDefinition#configurePreferences()
*/
@Override
public List<ProductBrowserPreference> configurePreferences() {
return super.configurePreferences();
}
}

View file

@ -0,0 +1,424 @@
package edu.wisc.ssec.cimss.viz.convectprob.rsc;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.graphics.RGB;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.raytheon.uf.common.colormap.Color;
import com.raytheon.uf.common.colormap.ColorMapException;
import com.raytheon.uf.common.colormap.prefs.ColorMapParameters;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.datastorage.DataStoreFactory;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.geospatial.ReferencedCoordinate;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle;
import com.raytheon.uf.common.colormap.ColorMapLoader;
import com.raytheon.uf.viz.core.drawables.IWireframeShape;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.MapDescriptor;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.dataplugin.HDF5Util;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.ConvectProbRecord;
/**
* NOAA/CIMSS Prob Severe Model Visualization Resource
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 lcronce Initial Creation.
*
* </pre
*
* @author Lee Cronce
* @version 1.0
*
*/
public class ConvectProbResource extends
AbstractVizResource<ConvectProbResourceData, MapDescriptor> {
private final IUFStatusHandler statusHandler = UFStatus
.getHandler(ConvectProbResource.class);
/**
* Class defining the attributes of the display frame
*
* This class holds cached shapes to avoid recalculating everything all
* the time
*/
private class DisplayFrame {
Collection<ConvectProbRecord> records = new ArrayList<ConvectProbRecord>();
IWireframeShape shape;
protected void dispose() {
if (this.shape != null) {
this.shape.dispose();
this.shape = null;
}
}
protected void createShapes(IGraphicsTarget target) {
dispose();
shape = target.createWireframeShape(false, descriptor);
}
}
// Place to store records that have not yet been processed
private Map<DataTime, Collection<ConvectProbRecord>> unprocessedRecords = new HashMap<DataTime, Collection<ConvectProbRecord>>();
private Map<DataTime, DisplayFrame> frames = new HashMap<DataTime, DisplayFrame>();
private DataTime displayedDataTime;
/**
* Constructor to define an instance of this resource
*
* @param ConvectProb plugin resource data
* @param Display load properties
*/
protected ConvectProbResource(ConvectProbResourceData resourceData,
LoadProperties loadProperties) {
super(resourceData, loadProperties);
resourceData.addChangeListener(new IResourceDataChanged() {
@Override
public void resourceChanged(ChangeType type, Object object) {
if (type == ChangeType.DATA_UPDATE) {
PluginDataObject[] pdo = (PluginDataObject[]) object;
for (PluginDataObject p : pdo) {
if (p instanceof ConvectProbRecord) {
addRecord((ConvectProbRecord) p);
}
}
}
issueRefresh();
}
});
this.dataTimes = new ArrayList<DataTime>();
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#disposeInternal()
*/
@Override
protected void disposeInternal() {
// Make sure we ditch all the shapes before we go
disposeFrames();
}
/**
* Disposes of all frames of visualization
*/
private void disposeFrames() {
synchronized (frames) {
for (DisplayFrame frame : frames.values()) {
frame.dispose();
}
}
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#getDataTimes()
*/
@Override
public DataTime[] getDataTimes() {
if (this.dataTimes == null) {
return new DataTime[0];
}
synchronized (dataTimes) {
return this.dataTimes.toArray(new DataTime[0]);
}
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#initInternal(com.raytheon.uf.viz.core.IGraphicsTarget)
*/
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
// Create colormap parameters
ColorMapParameters colorMapParams = getCapability(
ColorMapCapability.class).getColorMapParameters();
if (colorMapParams == null) {
colorMapParams = new ColorMapParameters();
}
String name = "Grid/gridded data";
if (colorMapParams.getColorMap() == null) {
if (colorMapParams.getColorMapName() != null)
name = colorMapParams.getColorMapName();
try {
colorMapParams.setColorMap(ColorMapLoader.loadColorMap(name));
} catch (ColorMapException e) {
statusHandler.handle(Priority.ERROR, "Error loading specified colormap: " + name, e);
}
}
colorMapParams.setColorMapMax(100.0f);
colorMapParams.setColorMapMin(0.0f);
float[] cbi = {0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f};
colorMapParams.setColorBarIntervals(cbi);
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#inspect(com.raytheon.uf.common.geospatial.ReferencedCoordinate)
*/
@Override
public String inspect(ReferencedCoordinate coord) throws VizException {
DisplayFrame frame = null;
synchronized (frames) {
frame = frames.get(this.displayedDataTime);
}
if (frame == null) {
return "";
}
StringBuilder sample = new StringBuilder();
Coordinate latLon = new Coordinate();
try {
latLon = coord.asLatLon();
} catch (Exception e1) {
statusHandler.handle(Priority.ERROR, "Error converting ReferencedCoordinate to Lat/Lon", e1);
}
GeometryFactory geom = new GeometryFactory();
Point point = geom.createPoint(latLon);
for (ConvectProbRecord record : frame.records) {
// Check if we have an area we are rendering
if (resourceData.isDisplayShape()) {
try {
Geometry[] pg = record.getPolyGeoms();
for (int i=0; i < pg.length; i++) {
if (pg[i].contains(point)) {
sample.append("SVR PROB: "+Integer.toString(record.getProbabilities()[i])+"%");
sample.append("\n- Env MUCAPE: "+record.getMucapes()[i]);
sample.append("\n- Env EBShear: "+record.getEbshears()[i]);
sample.append("\n- MRMS MESH: "+record.getMeshes()[i]);
sample.append("\n- Norm Vert Growth Rate (Max): "+record.getRcemisses()[i]);
sample.append("\n- Glaciation Rate (Max): "+record.getRcicecfs()[i]);
if (resourceData.isShowObjectId()) {
sample.append("\n- Object ID: "+record.getObjectids()[i]);
}
return sample.toString();
}
}
} catch (Exception e) {
statusHandler.handle(Priority.ERROR, "Error interogating convectprob data", e);
}
}
}
return "";
}
/**
* Process all records for the displayedDataTime
*
* @param target
* @param paintProps
* @throws VizException
*/
private void updateRecords(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
DisplayFrame frame = null;
synchronized (frames) {
frame = frames.get(this.displayedDataTime);
if (frame == null) {
frame = new DisplayFrame();
frames.put(this.displayedDataTime, frame);
}
}
// Add all the new Records
Collection<ConvectProbRecord> newRecords = null;
synchronized (unprocessedRecords) {
newRecords = unprocessedRecords.get(this.displayedDataTime);
}
for (ConvectProbRecord record : newRecords) {
// If we need to draw anything for this record then keep it
if (resourceData.isDisplayShape()) {
frame.records.add(record);
}
}
newRecords.clear();
// Get some new shapes
frame.createShapes(target);
// Update each record
for (ConvectProbRecord record : frame.records) {
File f = HDF5Util.findHDF5Location(record);
IDataStore ds = DataStoreFactory.getDataStore(f);
record.retrieveFromDataStore(ds);
}
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#paintInternal(com.raytheon.uf.viz.core.IGraphicsTarget, com.raytheon.uf.viz.core.drawables.PaintProperties)
*/
@Override
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
// Create colormap parameters
ColorMapParameters colorMapParams = getCapability(
ColorMapCapability.class).getColorMapParameters();
this.displayedDataTime = paintProps.getDataTime();
// First check to see if we need to process new data
Collection<ConvectProbRecord> unprocessed = null;
synchronized (unprocessedRecords) {
unprocessed = unprocessedRecords.get(this.displayedDataTime);
}
if (unprocessed != null && unprocessed.size() > 0) {
updateRecords(target, paintProps);
}
// Hopefully we now have some data to display, if not bail
DisplayFrame frame = null;
synchronized (frames) {
frame = frames.get(this.displayedDataTime);
}
if (frame == null) {
this.displayedDataTime = null;
return;
}
if (frame.records != null && frame.shape != null) {
boolean drawShape = false;
Color color;
float a, thick;
RGB shapeColor = new RGB(255, 255, 255);
for (ConvectProbRecord rec : frame.records) {
if (rec.getPolyGeoms() != null) {
Geometry[] polyGeoms = rec.getPolyGeoms();
int[] probabilities = rec.getProbabilities();
for (int j=0; j < 101; j++) {
frame.shape.reset();
drawShape = false;
for (int i=0; i < polyGeoms.length; i++) {
if (probabilities[i] == j) {
frame.shape.addLineSegment(polyGeoms[i].getCoordinates());
drawShape = true;
}
}
if (drawShape) {
color = colorMapParams.getColorByValue((float) j);
shapeColor.red = (int) (color.getRed() * 255);
shapeColor.green = (int) (color.getGreen() * 255);
shapeColor.blue = (int) (color.getBlue() * 255);
a = color.getAlpha() * paintProps.getAlpha();
thick = 7.0f;
if (j < 50) {
thick = 4.0f;
}
target.drawWireframeShape(frame.shape, shapeColor, thick, LineStyle.SOLID, a);
}
}
}
}
}
}
/**
* Adds a new record to this resource
*
* @param new ConvectProb record
*/
protected void addRecord(ConvectProbRecord obj) {
DataTime dataTime = obj.getDataTime();
if (dataTime != null) {
Collection<ConvectProbRecord> records = null;
boolean brandNew = false;
synchronized (unprocessedRecords) {
records = unprocessedRecords.get(dataTime);
if (records == null) {
records = new LinkedHashSet<ConvectProbRecord>();
unprocessedRecords.put(dataTime, records);
brandNew = true;
}
}
if (brandNew) {
synchronized (dataTimes) {
this.dataTimes.add(dataTime);
Collections.sort(this.dataTimes);
}
}
records.add(obj);
}
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#getName()
*/
@Override
public String getName() {
return "NOAA/CIMSS Prob Severe Model (%)";
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#project(org.opengis.referencing.crs.CoordinateReferenceSystem)
*/
@Override
public void project(CoordinateReferenceSystem crs) throws VizException {
synchronized (frames) {
disposeFrames();
// add as unprocessed to make sure frames created
for (DataTime time : frames.keySet()) {
DisplayFrame frame = frames.get(time);
if (frame != null) {
List<ConvectProbRecord> copyList = new ArrayList<ConvectProbRecord>(
frame.records);
synchronized (unprocessedRecords) {
unprocessedRecords.put(time, copyList);
}
}
}
}
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#remove(com.raytheon.uf.common.time.DataTime)
*/
@Override
public void remove(DataTime time) {
super.remove(time);
Collection<ConvectProbRecord> notNeeded = null;
synchronized (unprocessedRecords) {
notNeeded = unprocessedRecords.remove(time);
}
if (notNeeded != null) {
notNeeded.clear();
}
DisplayFrame frame = null;
synchronized (frames) {
frame = frames.remove(time);
}
if (frame != null) {
frame.dispose();
}
}
}

View file

@ -0,0 +1,130 @@
package edu.wisc.ssec.cimss.viz.convectprob.rsc;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import edu.wisc.ssec.cimss.common.dataplugin.convectprob.ConvectProbRecord;
/**
* NOAA/CIMSS Prob Severe Model Visualization Resource Data
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 27, 2014 DCS 15298 lcronce Initial Creation.
*
* </pre
*
* @author Lee Cronce
* @version 1.0
*
*/
@XmlAccessorType(XmlAccessType.NONE)
public class ConvectProbResourceData extends AbstractRequestableResourceData {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ConvectProbResourceData.class);
// This flag determines if we draw polygons
@XmlAttribute
private boolean displayShape = true;
// This flag determines if object IDs are output to screen during inspect
@XmlAttribute
private boolean showObjectId = false;
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) {
return false;
}
if (obj instanceof ConvectProbResourceData == false) {
return false;
}
ConvectProbResourceData other = (ConvectProbResourceData) obj;
if (other.displayShape != this.displayShape) {
return false;
}
if (other.showObjectId != this.showObjectId) {
return true;
}
return true;
}
/**
* @see com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData#constructResource(com.raytheon.uf.viz.core.rsc.LoadProperties, com.raytheon.uf.common.dataplugin.PluginDataObject[])
*/
@Override
protected AbstractVizResource<?, ?> constructResource(
LoadProperties loadProperties, PluginDataObject[] objects)
throws VizException {
ConvectProbResource rsc = new ConvectProbResource(this, loadProperties);
for (PluginDataObject o : objects) {
if (o instanceof ConvectProbRecord) {
ConvectProbRecord rec = (ConvectProbRecord) o;
rsc.addRecord(rec);
} else {
statusHandler.handle(Priority.PROBLEM,
"Received wrong type of data. Got: " + o.getClass()
+ " Expected: " + ConvectProbRecord.class);
}
}
return rsc;
}
/**
* Flag to see if shape should be displayed
*
* @return boolean
*/
public boolean isDisplayShape() {
return displayShape;
}
/**
* Set flag for displaying shape
*
* @param boolean
*/
public void setDisplayShape(boolean displayShape) {
this.displayShape = displayShape;
}
/**
* Flag to see if object ID should be displayed
*
* @return boolean
*/
public boolean isShowObjectId() {
return showObjectId;
}
/**
* Set flag for displaying shape
*
* @param boolean
*/
public void setShowObjectId(boolean showObjectId) {
this.showObjectId = showObjectId;
}
}

View file

@ -154,5 +154,6 @@
#???|256 | 0 | 0.25 | 230 | PRE | Inst Precip Rate (PRE) | Radial | y | | | | Z | | | | |63
166| 0 | 0 | 0.0 | 230 | ML | Melting Layer (ML) | Graphic | y | | | | Z | | | | |67
170|256 | 0 | 0.25 | 230 | DAA | One Hour Unbiased Accum (DAA) | Radial | | | | |0.01S| | | | |69
500 | 8 | 0 | 0.463 | 463 | HSR | Hybrid Scan Reflectivity (HSR)| Radial | | | | | | | | | |64
550 | 8 | 0 | 0.926 | 111 | HSR | Hybrid Scan Reflectivity (HSR)| Radial | | | | | | | | | |64
196| 0 | 0 | 0.0 | 50 | MBA | Microburst AMDA (MBA) | Generic | | | | | | | | | |28
500| 8 | 0 | 0.463| 463 | Z | Reflectivity (Z) | Radial | | | | | | | | | |64
550| 8 | 0 | 0.926| 111 | Z | Reflectivity (Z) | Radial | | | | | | | | | |64

View file

@ -7,6 +7,7 @@ Bundle-Vendor: RAYTHEON
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Require-Bundle: com.raytheon.uf.viz.core;bundle-version="1.14.0",
com.raytheon.viz.core.graphing,
com.raytheon.viz.ui;bundle-version="1.14.0",
gov.noaa.nws.ncep.ui.nsharp,
com.raytheon.uf.common.sounding,

View file

@ -24,9 +24,9 @@ import gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor;
import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpResourceHandler;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedHashMap;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.datastructure.LoopProperties;
import com.raytheon.uf.viz.core.exception.VizException;
@ -40,58 +40,68 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 26, 2006 chammack Initial Creation.
* Unknown bsteffen Initial creation
* Unknown cchen Modifications
* Dec 8, 2014 DR16713 jgerth Incorporate date and time
*
* </pre>
*
* @author chammack
* @author bsteffen
* @version 1
*/
public class NSharpSaveScreenAction extends ExportImageHandler {
@Override
protected BufferedImage captureCurrentFrames(AbstractEditor editor) {
return editor.getActiveDisplayPane().getTarget().screenshot();
protected LinkedHashMap<DataTime, BufferedImage> captureCurrentFrames(AbstractEditor editor) {
NsharpResourceHandler handler = ((NsharpEditor) editor).getRscHandler();
LinkedHashMap<DataTime, BufferedImage> dtbiHash = new LinkedHashMap<DataTime, BufferedImage>();
DataTime[] dataTimes = handler.getSkewtPaneRsc().getDescriptor().getFramesInfo().getFrameTimes();
if (dataTimes == null || dataTimes.length == 0) {
dtbiHash.put(buildFakeTime(0), editor.getActiveDisplayPane().getTarget().screenshot());
} else {
dtbiHash.put(dataTimes[handler.getCurrentIndex()], editor.getActiveDisplayPane().getTarget().screenshot());
}
return dtbiHash;
}
@Override
protected List<BufferedImage> captureAllFrames(AbstractEditor editor)
protected LinkedHashMap<DataTime, BufferedImage> captureAllFrames(AbstractEditor editor)
throws VizException {
if(!(editor instanceof NsharpEditor)){
return super.captureAllFrames(editor);
}
NsharpResourceHandler handler = ((NsharpEditor) editor).getRscHandler();
int startIndex = 0;
int endIndex = handler .getFrameCount(); // Chin NsharpFrameIndexUtil.getFrameCount(handler);
int endIndex = handler.getFrameCount();
return captureFrames(editor, startIndex, endIndex);
}
@Override
protected List<BufferedImage> captureFrames(AbstractEditor editor,
protected LinkedHashMap<DataTime, BufferedImage> captureFrames(AbstractEditor editor,
int startIndex, int endIndex) throws VizException {
if(!(editor instanceof NsharpEditor)){
return super.captureFrames(editor, startIndex, endIndex);
}
LinkedHashMap<DataTime, BufferedImage> dtbiHash = new LinkedHashMap<DataTime, BufferedImage>();
IDisplayPane pane = editor.getActiveDisplayPane();
NsharpResourceHandler handler = ((NsharpEditor) editor).getRscHandler();
// save the frame we are on;
int startingIndex = handler.getCurrentIndex(); // Chin NsharpFrameIndexUtil.getCurrentIndex(handler);
List<BufferedImage> images = new ArrayList<BufferedImage>();
LoopProperties loopProperties = ((AbstractEditor) editor)
.getLoopProperties();
int startingIndex = handler.getCurrentIndex();
LoopProperties loopProperties = ((AbstractEditor) editor).getLoopProperties();
renderPane(pane, loopProperties);
DataTime[] dataTimes = handler.getSkewtPaneRsc().getDescriptor().getFramesInfo().getFrameTimes();
for (int i = startIndex; i < endIndex; i++) {
//Chin NsharpFrameIndexUtil.setCurrentIndex(handler, i);
if(handler.setCurrentIndex(i)== false)
continue;
if (handler.setCurrentIndex(i) == false) {
continue;
}
pane.refresh();
renderPane(pane, loopProperties);
images.add(captureCurrentFrames(editor));
dtbiHash.put(dataTimes[i], editor.getActiveDisplayPane().getTarget().screenshot());
}
handler.setCurrentIndex(startingIndex); // Chin NsharpFrameIndexUtil.setCurrentIndex(handler, startingIndex);
handler.setCurrentIndex(startingIndex);
pane.refresh();
renderPane(pane, loopProperties);
return images;
return dtbiHash;
}
}

View file

@ -68,6 +68,7 @@ import com.raytheon.viz.core.graphing.xy.XYWindImageData;
* May 07, 2010 bsteffen Initial creation
* Feb 17, 2014 2661 bsteffen Use only u,v for vectors.
* Jun 18, 2014 3242 njensen Overrode getEnsembleId()
* Nov 19, 2014 5056 jing Added get arbitrary record
*
* </pre>
*
@ -324,7 +325,7 @@ public class GridTimeSeriesAdapter extends
dataPoint = new XYData(time, value);
}
}
if (dataPoint != null){
if (dataPoint != null) {
data.add(dataPoint);
}
}
@ -356,4 +357,20 @@ public class GridTimeSeriesAdapter extends
public String getEnsembleId() {
return ensembleId;
}
/**
* This method gets an arbitrary record from the cache.
*
* @return - A grid record.
*/
public GridRecord getArbitraryRecord() {
synchronized (cache) {
if (cache.keySet().isEmpty()) {
return null;
} else {
return (GridRecord) cache.keySet().toArray()[0];
}
}
}
}

View file

@ -39,6 +39,7 @@ import org.eclipse.swt.widgets.Text;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions.DateTimeSelection;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions.FrameSelection;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions.ImageFormat;
import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
@ -56,6 +57,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Mar 10, 2014 2867 bsteffen Better frame range validation.
* Oct 28, 2014 3767 bsteffen Automatically change filename if selected
* format does not support all options.
* Dec 4, 2014 DR16713 jgerth Support for date/time selection
*
* </pre>
*
@ -69,6 +71,8 @@ public class ImageExportDialog extends CaveSWTDialog {
protected Text locationText;
protected Button datetimeButton;
protected Button selectedFramesButton;
protected Button currentFramesButton;
@ -134,6 +138,13 @@ public class ImageExportDialog extends CaveSWTDialog {
selectDestinationFile();
}
});
datetimeButton = new Button(group, SWT.CHECK);
datetimeButton.setLayoutData(gridData);
datetimeButton.setText("Include date and time in file name");
datetimeButton
.setSelection(options.getDateTimeSelection() == DateTimeSelection.DATETIME);
datetimeButton
.setToolTipText("Append the date and time to the file name when Animate is not selected.");
}
protected void initializeFramesGroup(Group group) {
@ -211,6 +222,9 @@ public class ImageExportDialog extends CaveSWTDialog {
frameDelayText.setEnabled(animatedButton.getSelection());
firstFrameDwellText.setEnabled(animatedButton.getSelection());
lastFrameDwellText.setEnabled(animatedButton.getSelection());
datetimeButton.setEnabled(!animatedButton.getSelection());
datetimeButton.setSelection(false);
}
});
gridData = new GridData();
@ -364,6 +378,9 @@ public class ImageExportDialog extends CaveSWTDialog {
} else {
options.setImageFormat(ImageFormat.SEQUENCE);
}
if (datetimeButton.getSelection()) {
options.setDateTimeSelection(DateTimeSelection.DATETIME);
}
if (validate()) {
setReturnValue(options);
close();

View file

@ -20,12 +20,14 @@
package com.raytheon.uf.viz.image.export.handler;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Calendar;
import java.util.LinkedHashMap;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.swt.graphics.Rectangle;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.IGraphicsTarget;
@ -53,6 +55,7 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
* Date Ticket# Engineer Description
* ------------- -------- ----------- --------------------------
* Jan 20, 2014 2312 bsteffen Move to image export plugin.
* Dec 4, 2014 DR16713 jgerth Incorporate date and time
*
* </pre>
*
@ -61,11 +64,18 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
*/
public abstract class AbstractImageCaptureHandler extends AbstractHandler {
protected BufferedImage captureCurrentFrames(AbstractEditor editor) {
return editor.screenshot();
protected LinkedHashMap<DataTime, BufferedImage> captureCurrentFrames(AbstractEditor editor) {
LinkedHashMap<DataTime, BufferedImage> dtbiHash = new LinkedHashMap<DataTime, BufferedImage>();
DataTime[] dataTimes = editor.getActiveDisplayPane().getDescriptor().getFramesInfo().getFrameTimes();
if (dataTimes == null || dataTimes.length == 0) {
dtbiHash.put(buildFakeTime(0), editor.screenshot());
} else {
dtbiHash.put(dataTimes[editor.getActiveDisplayPane().getDescriptor().getFramesInfo().getFrameIndex()], editor.screenshot());
}
return dtbiHash;
}
protected List<BufferedImage> captureAllFrames(AbstractEditor editor)
protected LinkedHashMap<DataTime, BufferedImage> captureAllFrames(AbstractEditor editor)
throws VizException {
int startIndex = 0;
int endIndex = editor.getActiveDisplayPane().getDescriptor()
@ -76,28 +86,31 @@ public abstract class AbstractImageCaptureHandler extends AbstractHandler {
return captureFrames(editor, startIndex, endIndex);
}
protected List<BufferedImage> captureFrames(AbstractEditor editor,
protected LinkedHashMap<DataTime, BufferedImage> captureFrames(AbstractEditor editor,
int startIndex, int endIndex) throws VizException {
LinkedHashMap<DataTime, BufferedImage> dtbiHash = new LinkedHashMap<DataTime, BufferedImage>();
if (startIndex < 0) {
startIndex = 0;
}
List<BufferedImage> images = new ArrayList<BufferedImage>(endIndex
- startIndex);
int origIndex = editor.getActiveDisplayPane().getDescriptor()
.getFramesInfo().getFrameIndex();
int origIndex = editor.getActiveDisplayPane().getDescriptor().getFramesInfo().getFrameIndex();
DataTime[] dataTimes = editor.getActiveDisplayPane().getDescriptor().getFramesInfo().getFrameTimes();
for (int i = startIndex; i < endIndex; i++) {
for (IDisplayPane pane : editor.getDisplayPanes()) {
setFrameIndex(pane.getDescriptor(), i);
pane.refresh();
renderPane(pane, editor.getLoopProperties());
}
images.add(editor.screenshot());
if (dataTimes != null && dataTimes.length > 0) {
dtbiHash.put(dataTimes[i], editor.screenshot());
} else {
dtbiHash.put(buildFakeTime(i), editor.screenshot());
}
}
for (IDisplayPane pane : editor.getDisplayPanes()) {
setFrameIndex(pane.getDescriptor(), origIndex);
pane.refresh();
}
return images;
return dtbiHash;
}
private void setFrameIndex(IDescriptor desc, int index) {
@ -136,6 +149,20 @@ public abstract class AbstractImageCaptureHandler extends AbstractHandler {
}
}
/**
* Build a fake time when a time is not associated with a frame. The fake
* time is the number of milliseconds since the Epoch based on the integer
* frame number.
*
* @param the frame number
* @return the fake DataTime based on the frame number
*/
protected DataTime buildFakeTime(int i) {
Calendar c = TimeUtil.newGmtCalendar();
c.setTimeInMillis(i);
return new DataTime(c);
}
@Override
public void setEnabled(Object obj) {
IDisplayPaneContainer container = EditorUtil.getActiveVizContainer();

View file

@ -23,9 +23,16 @@ package com.raytheon.uf.viz.image.export.handler;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
@ -53,9 +60,11 @@ import org.w3c.dom.Node;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.image.export.dialog.ImageExportDialog;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions.DateTimeSelection;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions.FrameSelection;
import com.raytheon.uf.viz.image.export.options.ImageExportOptions.ImageFormat;
import com.raytheon.viz.ui.EditorUtil;
@ -70,6 +79,7 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
* ------------- -------- ----------- --------------------------
* Jul 26, 2006 chammack Initial Creation.
* Jan 20, 2014 2312 bsteffen Move to image export plugin, animation.
* Dec 4, 2014 DR16713 jgerth Support for date and time in file name
*
* </pre>
*
@ -80,6 +90,8 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ExportImageHandler.class);
private static final String DATE_TIME_FORMAT = "yyyyMMdd_HHmmss";
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IEditorPart part = EditorUtil.getActiveEditor();
@ -138,17 +150,17 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
}
}
List<BufferedImage> images = null;
LinkedHashMap<DataTime, BufferedImage> dtbiHash = new LinkedHashMap<DataTime, BufferedImage>();
try {
switch (options.getFrameSelection()) {
case CURRENT:
images = Arrays.asList(captureCurrentFrames(editor));
dtbiHash = captureCurrentFrames(editor);
break;
case ALL:
images = captureAllFrames(editor);
dtbiHash = captureAllFrames(editor);
break;
case USER:
images = captureFrames(editor, options.getFirstFrameIndex(),
dtbiHash = captureFrames(editor, options.getFirstFrameIndex(),
options.getLastFrameIndex());
break;
}
@ -158,8 +170,8 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
return null;
}
if (!images.isEmpty()) {
new SaveImageJob(options, images);
if (!dtbiHash.isEmpty()) {
new SaveImageJob(options, dtbiHash);
}
return null;
}
@ -175,10 +187,14 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
}
public void saveImages(IProgressMonitor monitor,
ImageExportOptions options, List<BufferedImage> images) {
monitor.beginTask("Saving Images", images.size());
ImageExportOptions options, Map<DataTime, BufferedImage> dtbiHash) {
monitor.beginTask("Saving Images", dtbiHash.size());
String path = options.getFileLocation().getAbsolutePath();
String ppath = path;
SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
NumberFormat twoDigit = new DecimalFormat("00");
String suffix = path.substring(path.lastIndexOf('.') + 1);
String basePath = path.substring(0, path.lastIndexOf('.'));
@ -192,33 +208,47 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
FileImageOutputStream stream = null;
try {
if (images.size() == 1) {
stream = new FileImageOutputStream(options.getFileLocation());
writer.setOutput(stream);
writer.write(images.get(0));
stream.close();
stream = null;
monitor.worked(1);
} else if (options.getImageFormat() == ImageFormat.SEQUENCE) {
for (int i = 0; i < images.size(); i++) {
BufferedImage bi = images.get(i);
/* Allow GC to collect image after write. */
images.set(i, null);
path = basePath + "-" + (i + 1) + "." + suffix;
if (options.getImageFormat() == ImageFormat.SEQUENCE) {
int i = 0;
for (Map.Entry<DataTime, BufferedImage> entry : dtbiHash.entrySet()) {
i++;
BufferedImage bi = entry.getValue();
if (options.getDateTimeSelection() == DateTimeSelection.DATETIME) {
DataTime key = entry.getKey();
Date validTime = key.getValidTimeAsDate();
if (validTime != null && !isFakeTime(key)) {
path = basePath + "-" + sdf.format(validTime) + "." + suffix;
if (path.equals(ppath)) {
path = basePath + "-" + sdf.format(validTime) + "-" + twoDigit.format(i).toString() + "." + suffix;
}
} else {
path = basePath + "-" + twoDigit.format(i).toString() + "." + suffix;
}
} else if (dtbiHash.size() > 1) {
path = basePath + "-" + twoDigit.format(i).toString() + "." + suffix;
} else {
path = basePath + "." + suffix;
}
ppath = path;
stream = new FileImageOutputStream(new File(path));
writer.setOutput(stream);
writer.write(bi);
stream.close();
stream = null;
if (monitor.isCanceled()) {
dtbiHash.clear();
break;
}
monitor.worked(1);
}
dtbiHash.clear();
} else if (options.getImageFormat() == ImageFormat.ANIMATION) {
stream = new FileImageOutputStream(options.getFileLocation());
writer.setOutput(stream);
writer.prepareWriteSequence(null);
List<BufferedImage> images = new ArrayList<BufferedImage>();
images.addAll(dtbiHash.values());
dtbiHash.clear();
for (int i = 0; i < images.size(); i++) {
BufferedImage bi = images.get(i);
/* Allow GC to collect image after write. */
@ -229,14 +259,12 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
if (i == 0) {
configureAnimation(metadata,
options.getFirstFrameDwell(), true);
} else if (i == images.size() - 1) {
configureAnimation(metadata,
options.getLastFrameDwell(), false);
} else {
configureAnimation(metadata, options.getFrameDelay(),
false);
}
IIOImage ii = new IIOImage(bi, null, metadata);
writer.writeToSequence(ii, null);
@ -313,23 +341,36 @@ public class ExportImageHandler extends AbstractImageCaptureHandler {
}
/**
* There may be cases in which a valid time is not associated with a frame.
* In such cases, a valid time is set to a number of milliseconds from the
* Epoch time based on the frame number. Here we check if that is one of
* those such cases.
*
* @param a DataTime
* @return true if the DataTime is close to the Epoch time
*/
public boolean isFakeTime(DataTime dt) {
return dt.getValidTime().getTimeInMillis() < 1000;
}
protected class SaveImageJob extends Job {
protected final ImageExportOptions options;
protected final List<BufferedImage> images;
protected final LinkedHashMap<DataTime, BufferedImage> dtbiHash;
protected SaveImageJob(ImageExportOptions options,
List<BufferedImage> images) {
LinkedHashMap<DataTime, BufferedImage> dtbiHash) {
super("Saving image");
this.options = options;
this.images = images;
this.dtbiHash = dtbiHash;
this.schedule();
}
@Override
protected IStatus run(IProgressMonitor monitor) {
saveImages(monitor, options, images);
saveImages(monitor, options, dtbiHash);
return Status.OK_STATUS;
}

View file

@ -61,6 +61,7 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
* Aug 08, 2008 703 randerso fixed bug, changed to scale to fit paper
* and rotate if necessary
* Jan 20, 2014 2312 bsteffen Move to image export plugin.
* Dec 4, 2014 DR16713 jgerth Support for date and time in file name
*
* </pre>
*
@ -116,7 +117,7 @@ public class PrintImageCaptureHandler extends AbstractImageCaptureHandler {
switch (pd.getScope()) {
case PrinterData.ALL_PAGES: {
try {
for (BufferedImage bi : captureAllFrames(editor)) {
for (BufferedImage bi : captureAllFrames(editor).values()) {
printImage(printer, display, bi);
}
} catch (VizException e) {
@ -128,7 +129,7 @@ public class PrintImageCaptureHandler extends AbstractImageCaptureHandler {
case PrinterData.PAGE_RANGE: {
try {
for (BufferedImage bi : captureFrames(editor,
pd.getStartPage() - 1, pd.getEndPage())) {
pd.getStartPage() - 1, pd.getEndPage()).values()) {
printImage(printer, display, bi);
}
} catch (VizException e) {

View file

@ -38,6 +38,7 @@ import com.raytheon.uf.viz.core.datastructure.LoopProperties;
* Jan 20, 2014 2312 bsteffen Initial creation
* Mar 10, 2014 2867 bsteffen Better frame range validation.
* Oct 28, 2014 3767 bsteffen Change default name to screenCapture.png
* Dec 4, 2014 DR16713 jgerth Support for date/time selection
*
* </pre>
*
@ -47,6 +48,10 @@ import com.raytheon.uf.viz.core.datastructure.LoopProperties;
public class ImageExportOptions {
public static enum DateTimeSelection {
DATETIME, SEQUENTIAL;
}
public static enum FrameSelection {
ALL, CURRENT, USER;
}
@ -86,6 +91,8 @@ public class ImageExportOptions {
private FrameSelection frameSelection = FrameSelection.CURRENT;
private DateTimeSelection dateTimeSelection = DateTimeSelection.SEQUENTIAL;
private int firstFrameIndex = 0;
private int lastFrameIndex = 0;
@ -119,6 +126,14 @@ public class ImageExportOptions {
this.imageFormat = imageFormat;
}
public DateTimeSelection getDateTimeSelection() {
return dateTimeSelection;
}
public void setDateTimeSelection(DateTimeSelection dts) {
this.dateTimeSelection = dts;
}
public FrameSelection getFrameSelection() {
return frameSelection;
}

View file

@ -61,6 +61,7 @@
<item mne="MD"/>
<item mne="DMD"/>
<item mne="GFM"/>
<item mne="MBA"/>
<item mne="MRU"/>
<item mne="TVS"/>
<item mne="TRU"/>

View file

@ -100,6 +100,8 @@ import com.vividsolutions.jts.geom.Geometry;
* Dec 19, 2013 DR 16795 D. Friedman Transform pixel coordinate in inspect
* Jun 18, 2014 3242 njensen Added ensembleId to legend
* Aug 15, 2014 3535 njensen Bigger inset map point
* Nov 19, 2014 5056 jing added getAdapter method, and
* changed getName to add level
*
* </pre>
*
@ -134,7 +136,7 @@ public class TimeSeriesResource extends
protected CombineOperation combineOperation;
private Set<DataTime> dataTimes = new TreeSet<DataTime>();
protected Set<DataTime> dataTimes = new TreeSet<DataTime>();
private Job dataRequestJob = new Job("Requesting Time Series Data") {
@ -255,6 +257,10 @@ public class TimeSeriesResource extends
});
}
public AbstractTimeSeriesAdapter<?> getAdapter() {
return adapter;
}
@Override
protected void disposeInternal() {
if (secondaryResource != null) {
@ -485,22 +491,26 @@ public class TimeSeriesResource extends
}
String levelKey = resourceData.getLevelKey();
String levelUnit = levelKey.replaceAll("[^a-zA-Z]", "");
boolean isHeight = levelUnit.equalsIgnoreCase("mb")
|| levelUnit.equalsIgnoreCase("agl")
|| levelUnit.contains("Agl");
// String levelUnit = levelKey.replaceAll("[^a-zA-Z]", "");
// boolean isHeight = levelUnit.equalsIgnoreCase("mb")
// || levelUnit.equalsIgnoreCase("agl")
// || levelUnit.contains("Agl");
// Make legend for point data
StringBuilder sb = new StringBuilder(String.format("%s pt%s %s%s %s%s",
source, resourceData.getPointLetter(), lat, y >= 0 ? "N" : "S",
lon, x >= 0 ? "E" : "W"));
// add level in x legend only if levelKey is not empty
StringBuilder sb = new StringBuilder(String.format(
"%s %s pt%s %s%s %s%s", source, levelKey != null ? levelKey
: "", resourceData.getPointLetter(), lat, y >= 0 ? "N"
: "S", lon, x >= 0 ? "E" : "W"));
if (stnID != null) {
sb.append(" ").append(stnID);
}
if (!isHeight) {
sb.append(" ").append(resourceData.getLevelKey());
}
// if (!isHeight) {
// sb.append(" ").append(resourceData.getLevelKey());
// }
sb.append(String.format(" %s %s %s", adapter.getParameterName(),
"TSer", units != null && units.equals("") == false ? "("
+ units + ")" : ""));

View file

@ -23,6 +23,10 @@ package com.raytheon.viz.awipstools.ui.action;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
@ -30,9 +34,8 @@ import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.status.StatusConstants;
import com.raytheon.viz.awipstools.Activator;
import com.raytheon.viz.awipstools.ui.dialog.LAPSToolsDlg;
import com.raytheon.viz.ui.EditorUtil;
/**
* TODO Add Description
@ -43,7 +46,9 @@ import com.raytheon.viz.awipstools.ui.dialog.LAPSToolsDlg;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
*
* May 2009 # bsteffen Initial creation
* Nov 2013 # mccaslin Only one GUI dialog at a time
* Oct 2014 # mccaslin Improved error handeling
*
* </pre>
*
@ -53,15 +58,59 @@ import com.raytheon.viz.awipstools.ui.dialog.LAPSToolsDlg;
public class LapsToolsAction extends AbstractHandler {
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(LapsToolsAction.class);
/**
* LAPS Tools dialog.
*/
private static LAPSToolsDlg lapsToolsDlg = null;
public static LAPSToolsDlg getLapsToolsDlg() {
return lapsToolsDlg;
}
public Object execute(ExecutionEvent arg0) throws ExecutionException {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell();
try {
new LAPSToolsDlg(shell).open();
} catch (VizException e) {
statusHandler.handle(Priority.PROBLEM,
"Error: Cannot open LAPS Tools", e);
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;
//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);
}
}
return null;
}

View file

@ -1,7 +1,11 @@
package com.raytheon.viz.awipstools.ui.action;
import java.awt.geom.Point2D;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;
import org.geotools.referencing.GeodeticCalculator;
import com.vividsolutions.jts.geom.Coordinate;
@ -19,24 +23,24 @@ public class LapsToolsData {
private Double gridSpacing;
private Double dp;
private Double lowp;
private Double lat;
private Double lat2;
private Double lon;
private Coordinate[] corners;
private Envelope cwaArea;
private Envelope validArea;
private Envelope validAreaOrig;
private Envelope validAreaDefault;
private Envelope gridArea;
private String areaCoverageString;
private Boolean belowLimits;
public Coordinate getGridCenter() {
return gridCenter;
}
@ -61,22 +65,38 @@ public class LapsToolsData {
return gridSpacing;
}
public Double getDp() {
return dp;
}
public String getAreaCoverageString() {
double nxDist = getNx()*getGridSpacing()/1000;
double nyDist = getNy()*getGridSpacing()/1000;
double areaCoverage = nxDist * nyDist;
this.areaCoverageString = String.format("%.1f km by %.1f km = %.2f km2",
nxDist, nyDist, areaCoverage);
double maximumArea = 14140140.;
double minimumArea = 150000.;
public Double getLowp() {
return lowp;
}
if(areaCoverage > maximumArea) {
System.out.print("LAPS Tools Data: problem with this domain exceeding the RUC 236 background\n");
MessageDialog.openWarning(getShell(), "Domain Size Error",
"The size of new domain would exceed the maximum limits \n\tdefined by model background (the RAP40 grid).\n");
} else if(areaCoverage < minimumArea) {
System.out.print("LAPS Tools Data: problem with this domain coverage area being smaller than the CWA coverage area\n");
MessageDialog.openWarning(getShell(), "Domain Size Error",
"The size of new domain area would LESS than the minimum limits \n\tdefined by the CWA coverage area.");
}
public Double getLat() {
return areaCoverageString;
}
private Shell getShell() {
// TODO Auto-generated method stub
return null;
}
public Double getLat() {
return lat;
}
public Double getLat2() {
return lat2;
}
public Double getLon() {
return lon;
}
@ -85,22 +105,57 @@ public class LapsToolsData {
return cwaArea;
}
public void setLimits(Boolean belowLimits) {
this.belowLimits = belowLimits;
}
public Boolean getLimits() {
return belowLimits;
}
public Envelope getValidArea() {
if (validArea == null) {
double halfHeight = Math.abs(corners[3].x - corners[0].x) / 2;
double halfWidth = Math.abs(corners[0].y - corners[3].y) / 2;
double cwa_dist_lat = halfHeight - cwaArea.getHeight() / 2;
double cwa_dist_lon = halfWidth - cwaArea.getWidth() / 2;
double buffer = .1; // tenth of a degree buffer around CWA (in km)
double cosBuffer = Math.abs(2*Math.cos(cwaArea.centre().y));
double cwa_dist_lat = Math.abs(cwaArea.getHeight() / 2) + (2 * buffer);
double cwa_dist_lon = Math.abs(cwaArea.getWidth() / 2) + (2 * buffer * cosBuffer);
validArea = new Envelope(cwaArea.centre());
validArea.expandBy(cwa_dist_lon, cwa_dist_lat);
validArea.expandBy(cwa_dist_lon, cwa_dist_lat);
double z = Math.abs(cwaArea.getHeight() / cwaArea.getWidth()) ;
System.out.print("LAPS Tools Data: cwa height = "+cwaArea.getHeight()+"\n");
System.out.print("cwa width = "+cwaArea.getWidth()+"\n");
System.out.print("z ratio = "+z+"\n");
}
return validArea;
}
public Envelope getValidAreaOrig() {
if (validAreaOrig == null) {
double cwa_dist_lat = Math.abs(cwaArea.getHeight() / 2);
double cwa_dist_lon = Math.abs(cwaArea.getWidth() / 2);
validAreaOrig = new Envelope(cwaArea.centre());
validAreaOrig.expandBy(cwa_dist_lon, cwa_dist_lat);
}
return validAreaOrig;
}
public Envelope getValidAreaDefault() {
if (validAreaDefault == null) {
double buffer = 1; // half degree buffer around CWA (in km)
double cosBuffer = Math.abs(2*Math.cos(cwaArea.centre().y));
double cwa_dist_lat = Math.abs(cwaArea.getHeight() / 2) + (2 * buffer);
double cwa_dist_lon = Math.abs(cwaArea.getWidth() / 2) + (2 * buffer * cosBuffer);
validAreaDefault = new Envelope(cwaArea.centre());
validAreaDefault.expandBy(cwa_dist_lon, cwa_dist_lat);
}
return validAreaDefault;
}
public Envelope getGridArea() {
if (gridArea == null) {
double width = gridSpacing * nx;
double height = gridSpacing * ny;
double width = getGridSpacing() * nx;
double height = getGridSpacing() * ny;
GeodeticCalculator gc = new GeodeticCalculator();
gc.setStartingGeographicPoint(gridCenter.x, gridCenter.y);
gc.setDirection(0.0, height / 2);
@ -129,16 +184,7 @@ public class LapsToolsData {
}
return gridArea;
}
public Coordinate[] getCorners() {
return corners;
}
public void setCorners(Coordinate[] corners) {
validArea = null;
this.corners = corners;
}
public void setCwaArea(Envelope cwaArea) {
validArea = null;
this.cwaArea = cwaArea;
@ -178,24 +224,71 @@ public class LapsToolsData {
this.nz = nz;
}
public void setDp(Double dp) {
this.dp = dp;
}
public void setLowp(Double lowp) {
this.lowp = lowp;
}
public void setLat(Double lat) {
this.lat = lat;
}
public void setLat2(Double lat2) {
this.lat2 = lat2;
}
public void setLon(Double lon) {
this.lon = lon;
}
//LAPS domain.xml has <domain> tags and <NX_L> tags, etc
@XmlRootElement(name="domain", namespace="")
public static class LapsDomain {
private Integer nx;
private Integer ny;
private Integer nz;
private Double gridSpacing;
private Double lat;
private Double lon;
public int getNx() {
return nx;
}
@XmlElement(name = "NX_L")
public void setNx(int nx) {
this.nx = nx;
}
public int getNy() {
return ny;
}
@XmlElement(name = "NY_L")
public void setNy(int ny) {
this.ny = ny;
}
public int getNz() {
return nz;
}
@XmlElement(name = "NK_LAPS")
public void setNz(int nz) {
this.nz = nz;
}
public Double getGridSpacing() {
return gridSpacing;
}
@XmlElement(name = "GRID_SPACING_M")
public void setGridSpacing(Double gridSpacing) {
this.gridSpacing = gridSpacing;
}
public Double getGridCenLat() {
return lat;
}
@XmlElement(name = "GRID_CEN_LAT")
public void setGridCenLat(Double lat) {
this.lat = lat;
}
public Double getGridCenLon() {
return lon;
}
@XmlElement(name = "GRID_CEN_LON")
public void setGridCenLon(Double lon) {
this.lon = lon;
}
}
}

View file

@ -4,12 +4,7 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collection;
@ -17,28 +12,41 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXB;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.geospatial.SpatialException;
import com.raytheon.uf.common.geospatial.SpatialQueryFactory;
import com.raytheon.uf.common.geospatial.SpatialQueryResult;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.time.SimulatedTime;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.localization.LocalizationManager;
import com.vividsolutions.jts.geom.Coordinate;
import com.raytheon.viz.awipstools.ui.action.LapsToolsData.LapsDomain;
import com.vividsolutions.jts.geom.Envelope;
/**
* This class performs all the filesystem and server input/output for the laps
* tools. This implementation was ported as directly as possible from awips1,
* and is not necessarily a good design for multiprocess and multisystem
* communication.
* This class no longer performs all the file system, server input/output for laps.
* LAPS support scripts now conduct the localization process.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 2009 # bsteffen Initial creation
* Nov 2013 # mccaslin New design approach, changed from OS calls to file io, read xml code, etc
*
* </pre>
*
@ -47,331 +55,147 @@ import com.vividsolutions.jts.geom.Coordinate;
*/
public class LapsToolsIO {
private static final String SERVER_STATUS_CMD_FRMT = "%s uname -n";
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(LapsToolsIO.class);
private static final String TIMESTAMP_CMD_FRMT = "%s %s/etc/fxalogdir.pl";
private static final String SURFACE_LOG_CMD_FRMT = "%s %s/sfc.pl -l%s -rlaps_sfc";
private static final String OTHER_LOG_CMD_FRMT = "%s %s/%s %s";
private static final String CHANGE_CENTER_CMD_FMT = "%s/etc/change-center.pl %s";
private static final String WINDOW_DOMAIN_CMD_FMT = "%s/etc/window_domain_rt.pl -w laps -i %s -s %s -t %s -c";
private static final String RELOCALIZE_CMD_FMT = "%s/etc/wfo-relocalization.pl";
private static final String FINALIZE_CMD_FMT = "/awips/fxa/bin/fxaAnnounce '%s' SYSTEM SIGNIFICANT; rm %s";
private static String serverName;
private static File lapsRoot;
private static File scriptDir;
private static String execCmd;
private static File nest7grid;
private static File nest7grid_template;
private static File nest7grid_orig;
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;
private static List<String> dataScripts;
private static File cornerPointFile;
private static File lockFile;
static {
// TODO all this configuration should be customizable by the user.
serverName = "px1f";
// --- For what got in log files ---
if (System.getenv("FXA_DATA") == null) {
fxaData = new File("/awips/fxa");
fxaData = new File("/data/fxa");
} else {
fxaData = new File(System.getenv("FXA_DATA"));
}
if (System.getenv("LAPSROOT") == null) {
lapsRoot = new File(fxaData + "/laps");
} else {
lapsRoot = new File(System.getenv("LAPSROOT"));
}
scriptDir = new File(lapsRoot + "/etc");
execCmd = "ssh -q " + serverName;
dataChoices = Arrays.asList("Surface", "Wind", "Humidity", "Clouds",
"Temperature");
dataScripts = Arrays.asList("sfc.pl", "wind3d.pl", "hum3d.pl",
"cloud.pl", "temp.pl");
nest7grid = new File(fxaData + "/laps/static/nest7grid.parms");
nest7grid_orig = new File(fxaData + "/laps_data/static/nest7grid.parms");
nest7grid_template = new File(fxaData + "/laps_domain/nest7grid.parms");
cornerPointFile = new File(fxaData + "/laps/static/corners.dat");
lockFile = new File(fxaData + "/laps_domain/lock_laps_ui");
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");
}
public static Collection<String> getDataChoices() {
return dataChoices;
}
public static void lockLaps() throws VizException {
if (lockFile.exists()) {
throw new VizException(
"Sorry, but LAPS tool is currently processing another request and will not be available until the current process has completed.");
}
// For some reason awips1 doesn't actually lock it until you localize
}
public static void unlockLaps() {
if (lockFile.exists()) {
lockFile.delete();
}
}
public static String getFailover() throws IOException,
InterruptedException, VizException {
Process p = null;
try {
p = Runtime.getRuntime().exec(
String.format(SERVER_STATUS_CMD_FRMT, execCmd));
int status = p.waitFor();
String result = readOutput(p);
if (status == 0) {
// Success getting to machine
String actual_name = result.split("-")[0];
if (!serverName.replaceAll("f$", "").equals(actual_name)) {
// Failover state
return String
.format("Note: %s is running in a failover state. LAPS log files may not yet be available.",
serverName);
}
} else {
throw new VizException(
String.format(
"Sorry, error getting to %s system. The LAPS Tools GUI is not available.",
serverName));
}
} finally {
if (p != null) {
p.destroy();
}
}
return null;
}
public static String getLogs(String type) throws IOException,
InterruptedException {
Process tsProcess = null;
Process logProcess = null;
try {
tsProcess = Runtime.getRuntime().exec(
String.format(TIMESTAMP_CMD_FRMT, execCmd, lapsRoot));
tsProcess.waitFor();
String timeStamp = readOutput(tsProcess);
String cmd = null;
if (type.equals("Surface")) {
cmd = String.format(SURFACE_LOG_CMD_FRMT, execCmd, scriptDir,
timeStamp);
} else {
cmd = String.format(OTHER_LOG_CMD_FRMT, execCmd, scriptDir,
dataScripts.get(dataChoices.indexOf(type)), timeStamp);
}
logProcess = Runtime.getRuntime().exec(cmd);
logProcess.waitFor();
String result = readOutput(logProcess);
return result;
} finally {
if (tsProcess != null) {
tsProcess.destroy();
}
if (logProcess != null) {
logProcess.destroy();
}
}
VizException {
String wgiFile = String.format(WHATGOTIN_FILE_FRMT, lapsLogs,
whatgotinFiles.get(dataChoices.indexOf(type)));
String resultIO = loadWhatGotInFile(wgiFile, type);
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();
}
String line;
int lineNumber = 0;
while ((line = reader.readLine()) != null) {
String arg = String.format("%04d: %s%n", ++lineNumber, line);
output.append(arg);
}
reader.close();
return output.toString();
}
public static LapsToolsData loadData() throws IOException, VizException,
SpatialException {
LapsToolsData data = new LapsToolsData();
LapsToolsIO.readParmsFile(data);
LapsToolsIO.readCornerPointsFile(data);
LapsToolsIO.readCountyWarningArea(data);
if(LapsToolsIO.readXmlFile(data)) {
LapsToolsIO.readCountyWarningArea(data);
} else {
data = null;
}
return data;
}
public static String getLocalizationQuestion() {
String date = new SimpleDateFormat("HH:mm").format(SimulatedTime
.getSystemTime().getTime());
return String
.format("Are you sure you want to localize? \n- The procedure takes five minutes. Consider that it is %s and LAPS runs at 20 after the hour. \n\n- Localization runs remotely on %s. The LAPS Tools will be unavailable until the relocalization is complete, which will be noted in the AlertViz window.",
date, serverName);
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());
}
data.setNx(domain.getNx());
data.setNy(domain.getNy());
data.setNz(domain.getNz());
data.setGridSpacing(domain.getGridSpacing());
data.setGridCenterLon(domain.getGridCenLon());
data.setGridCenterLat(domain.getGridCenLat());
return true;
}
public static void localize(LapsToolsData data) throws IOException,
InterruptedException {
if (!lockFile.getParentFile().exists()) {
lockFile.getParentFile().mkdir();
}
if (!lockFile.exists()) {
lockFile.createNewFile();
}
if (!nest7grid_template.getParentFile().exists()) {
nest7grid_template.getParentFile().mkdir();
}
Writer writer = new FileWriter(nest7grid_template);
writer.write(" &lapsparms_nl\n");
writer.write(String.format(" GRID_CEN_LAT_CMN=%s,\n",
data.getGridCenter().y));
writer.write(String.format(" GRID_CEN_LON_CMN=%s,\n",
data.getGridCenter().x));
writer.write(String.format(" NX_L_CMN=%s,\n", data.getNx()));
writer.write(String.format(" NY_L_CMN=%s,\n", data.getNy()));
writer.write(String.format(" NK_LAPS=%s,\n", data.getNz()));
writer.write("/\n");
writer.close();
String centerPoints = data.getGridCenter().y + " "
+ data.getGridCenter().x;
String dir = lapsRoot.getAbsolutePath();
String templateDir = nest7grid_template.getParent();
String msg = "LAPS localization is finished.";
// execute the command in a shell to achieve proper IO redirection to
// laps_ui.log
Process p = null;
try {
p = Runtime.getRuntime().exec("/bin/sh");
writer = new OutputStreamWriter(p.getOutputStream());
writer.write(execCmd);
writer.write(" \"");
writer.write(String
.format(CHANGE_CENTER_CMD_FMT, dir, centerPoints));
writer.write("; ");
writer.write(String.format(WINDOW_DOMAIN_CMD_FMT, dir, dir, dir,
templateDir));
writer.write("; ");
writer.write(String.format(RELOCALIZE_CMD_FMT, dir));
writer.write("; ");
writer.write(String.format(FINALIZE_CMD_FMT, msg, lockFile));
writer.write("\"");
writer.write(" >& /tmp/laps_ui.log &");
writer.write("\n");
writer.close();
// Don't wait for the process to finish.
final Process process = p;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
process.waitFor();
} catch (InterruptedException e) {
// Ignore
} finally {
process.destroy();
}
}
});
// Let the Thread do the destroy when process is finished.
p = null;
t.start();
} finally {
if (p != null) {
p.destroy();
}
}
}
public static void readParmsFile(LapsToolsData data) throws IOException,
VizException {
loadFileParms(nest7grid, data);
}
public static void readDefaultParmsFile(LapsToolsData data)
public static void defaultDomain(LapsToolsData data)
throws IOException, VizException {
if (!nest7grid_orig.isFile()) {
loadFileParms(nest7grid_orig, data);
}
loadFileParms(nest7grid_orig, data);
}
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 aspectRatio = widthY / widthX;
double buffer = 0.5;
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");
private static void loadFileParms(File file, LapsToolsData data)
throws VizException, IOException {
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException e) {
throw new VizException(String.format(
"LAPS Tools GUI cannot run. %s does not exist.",
file.getAbsolutePath()), e);
}
int index = 0;
for (String line = reader.readLine(); line != null; line = reader
.readLine()) {
index += 1;
if (index == 1 || line.length() < 3 || line.startsWith("c")
|| line.startsWith(" &")) {
// Ignore comments, short lines and the first line, because
// Awips1 does
} else {
line = line.trim();
line = line.replaceAll(",$", "");
String[] halves = line.split("=");
String var = halves[0].toLowerCase().trim();
if (var.equals("grid_cen_lon_cmn")) {
data.setGridCenterLon(Double.valueOf(halves[1].trim()));
} else if (var.equals("grid_cen_lat_cmn")) {
data.setGridCenterLat(Double.valueOf(halves[1].trim()));
} else if (var.equals("grid_spacing_m_cmn")) {
data.setGridSpacing(Double.valueOf(halves[1].trim()));
} else if (var.equals("nx_l_cmn")) {
data.setNx(Integer.valueOf(halves[1].trim()));
} else if (var.equals("ny_l_cmn")) {
data.setNy(Integer.valueOf(halves[1].trim()));
} else if (var.equals("standard_latitude")) {
data.setLat(Double.valueOf(halves[1].trim()));
} else if (var.equals("standard_latitude2")) {
data.setLat2(Double.valueOf(halves[1].trim()));
} else if (var.equals("standard_longitude")) {
data.setLon(Double.valueOf(halves[1].trim()));
} else if (var.equals("nk_laps")) {
data.setNz(Integer.valueOf(halves[1].trim()));
} else if (var.equals("pressure_interval_l")) {
data.setDp(Double.valueOf(halves[1].trim()));
} else if (var.equals("pressure_bottom_l")) {
data.setLowp(Double.valueOf(halves[1].trim()));
}
}
}
}
private static void readCornerPointsFile(LapsToolsData data)
throws VizException, NumberFormatException, IOException {
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(cornerPointFile));
} catch (FileNotFoundException e) {
throw new VizException(String.format(
"LAPS Tools GUI cannot run. %s does not exist.",
cornerPointFile.getAbsolutePath()), e);
}
Coordinate[] corners = new Coordinate[4];
int count = 0;
for (String line = reader.readLine(); line != null; line = reader
.readLine()) {
corners[count] = new Coordinate(Double.valueOf(line.trim().split(
" ", 2)[0].trim()), Double.valueOf(line.trim()
.split(" ", 2)[1].trim()));
count += 1;
}
data.setCorners(corners);
reader.close();
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);
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);
}
private static void readCountyWarningArea(LapsToolsData data)
@ -385,18 +209,31 @@ 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);
}
private static String readOutput(Process p) throws IOException,
InterruptedException {
StringBuilder output = new StringBuilder();
char[] buf = new char[10];
Reader reader = new InputStreamReader(p.getInputStream());
for (int count = 0; count != -1; count = reader.read(buf)) {
output.append(buf, 0, count);
}
reader.close();
return output.toString();
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");
LapsDomain lapsdomain = new LapsDomain();
lapsdomain.setNx(data.getNx());
lapsdomain.setNy(data.getNy());
lapsdomain.setNz(data.getNz());
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());
}
}

View file

@ -31,11 +31,14 @@ import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
@ -50,8 +53,6 @@ import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.EditableCapability;
import com.raytheon.uf.viz.core.rsc.tools.GenericToolsResourceData;
import com.raytheon.uf.viz.core.status.StatusConstants;
import com.raytheon.viz.awipstools.Activator;
import com.raytheon.viz.awipstools.ui.action.LapsToolsData;
import com.raytheon.viz.awipstools.ui.action.LapsToolsIO;
import com.raytheon.viz.awipstools.ui.layer.LapsToolLayer;
@ -68,7 +69,7 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
*
* Nov 2013 # mccaslin Improved layout, more user friendly, no system calls
*
* </pre>
*
@ -76,6 +77,7 @@ 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 final LapsToolsData data;
@ -85,6 +87,8 @@ public class LAPSToolsDlg extends CaveSWTDialog {
*/
private Composite mainComp;
public final String DIALOG_TITLE = "LAPS V2.0 Tools";
/**
* Label indicating which tool is selected.
*/
@ -93,14 +97,19 @@ public class LAPSToolsDlg extends CaveSWTDialog {
/**
* Current Analysis string.
*/
private final String dataUsedByAnalysis = "Data Used by Current Analysis";
private final String dataUsedByAnalysis = "What-got-in to the Current Analysis Product";
/**
* Configure Analysis string.
*/
private final String configureAnalysis = "Configure Analysis Domain";
private final String configureAnalysis = "View or Redefine Analysis Domain";
/**
* Flag indicating if LAPS 2.0 is installed.
*/
private boolean isLapsInstalled = false;
/**
* Flag indicating which tool is active.
*/
private boolean isDataUsedByAnalysis = true;
@ -130,19 +139,13 @@ public class LAPSToolsDlg extends CaveSWTDialog {
*/
private Font selectToolLabelFont;
/*
/**
* Spinner controls
*/
private Spinner cenLatSpnr;
private Spinner cenLonSpnr;
private Spinner latSpnr;
private Spinner lat2Spnr;
private Spinner lonSpnr;
private Spinner nxSpnr;
private Spinner nySpnr;
@ -151,31 +154,31 @@ public class LAPSToolsDlg extends CaveSWTDialog {
private Spinner nzSpnr;
private Spinner dpPaSpnr;
private Spinner lowPaSpnr;
/*
/**
* Settings buttons
*/
private Button defaultBtn;
private Button resetBtn;
/*
* LAPS Relocator buttons.
/**
* LAPS display domain buttons.
*/
private Button loadBtn;
private Button applyBtn;
private Button localizeLapsBtn;
private Button writeDomainBtn;
/**
* Stack layout.
*/
private StackLayout stackLayout;
private MessageBox areaDialog;
private Label areaStrLbl;
/**
* Constructor.
*
@ -185,18 +188,19 @@ public class LAPSToolsDlg extends CaveSWTDialog {
*/
public LAPSToolsDlg(Shell parent) throws VizException {
super(parent, SWT.DIALOG_TRIM);
setText(DIALOG_TITLE);
try {
LapsToolsIO.lockLaps();
String failover = LapsToolsIO.getFailover();
if (failover != null) {
MessageDialog.openInformation(shell,
"LAPS is running in failover.", failover);
}
this.data = LapsToolsIO.loadData();
if(data==null){
isLapsInstalled = false;
} else {
isLapsInstalled = true;
}
} catch (VizException e) {
MessageDialog
.openInformation(shell, "LAPS Tools GUI is not available.",
.openInformation(shell, "LAPS Tools GUI cannot run.",
e.getLocalizedMessage());
throw e;
} catch (Exception e) {
@ -226,7 +230,6 @@ public class LAPSToolsDlg extends CaveSWTDialog {
protected void initializeComponents(Shell shell) {
selectToolLabelFont = new Font(this.getDisplay(), "Sans", 10, SWT.BOLD
| SWT.ITALIC);
mainComp = new Composite(shell, SWT.NONE);
GridLayout gl = new GridLayout(1, true);
gl.marginHeight = 2;
@ -237,6 +240,11 @@ public class LAPSToolsDlg extends CaveSWTDialog {
createMenus();
createMainControls();
// create dialog with OK and cancel button and info icon
areaDialog =
new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
areaDialog.setText("Size of LAPS Domain");
}
/**
@ -344,18 +352,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);
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/");
// ------------------------------------------------------
// 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...");
aboutMI.setText("About LAPS...");
aboutMI.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
dialog.open();
}
});
}
/**
@ -399,24 +416,36 @@ public class LAPSToolsDlg extends CaveSWTDialog {
true, false));
Composite controlComp = new Composite(currentAnalysisComp, SWT.NONE);
controlComp.setLayout(new GridLayout(3, false));
controlComp.setLayout(new GridLayout(4, false));
controlComp.setLayoutData(new GridData(SWT.CENTER, SWT.DEFAULT, true,
false));
Label selectTypeLbl = new Label(controlComp, SWT.NONE);
selectTypeLbl.setText("Select Type: ");
selectTypeLbl.setText("What got into the: ");
Combo typeCbo = new Combo(controlComp, SWT.DROP_DOWN | SWT.READ_ONLY);
populateTypeCombo(typeCbo);
typeCbo.select(0);
typeCbo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Combo c = (Combo) e.widget;
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())));
}
}
});
typeCbo.select(0);
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() {
@ -425,12 +454,13 @@ public class LAPSToolsDlg extends CaveSWTDialog {
clearAction();
}
});
clearBtn.setToolTipText("Clear screen.");
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
gd.widthHint = 500;
gd.heightHint = 300;
stText = new StyledText(currentAnalysisComp, SWT.BORDER | SWT.MULTI
| SWT.V_SCROLL | SWT.H_SCROLL);
| SWT.V_SCROLL | SWT.H_SCROLL | SWT.Deactivate);
stText.setLayoutData(gd);
}
@ -448,21 +478,25 @@ public class LAPSToolsDlg extends CaveSWTDialog {
createProjectionGroup();
createGridGroup();
createAreaGroup();
createSettingsLapsGroups();
populateSpinners();
GridData gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
gd.widthHint = 180;
gd.verticalIndent = 15;
localizeLapsBtn = new Button(configureAnalysisComp, SWT.PUSH);
localizeLapsBtn.setText("Localize LAPS");
localizeLapsBtn.setLayoutData(gd);
localizeLapsBtn.addSelectionListener(new SelectionAdapter() {
writeDomainBtn = new Button(configureAnalysisComp, SWT.PUSH);
writeDomainBtn.setText("Write file");
writeDomainBtn.setLayoutData(gd);
writeDomainBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
localizeLapsAction();
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." );
}
/**
@ -480,7 +514,7 @@ public class LAPSToolsDlg extends CaveSWTDialog {
*/
gd = new GridData(120, SWT.DEFAULT);
Label projectionStrLbl = new Label(projectionGroup, SWT.CENTER);
projectionStrLbl.setText("PolarStr");
projectionStrLbl.setText("Polar Stereographic");
projectionStrLbl.setLayoutData(gd);
/*
@ -533,62 +567,6 @@ public class LAPSToolsDlg extends CaveSWTDialog {
cenLonSpnr.setIncrement(1000);
cenLonSpnr.setLayoutData(gd);
// 3 Filler Label
new Label(projectionGroup, SWT.NONE);
new Label(projectionGroup, SWT.NONE);
new Label(projectionGroup, SWT.NONE);
/*
* Lat
*/
gd = new GridData(SWT.RIGHT, SWT.CENTER, false, true);
Label latLbl = new Label(projectionGroup, SWT.NONE);
latLbl.setText("Lat: ");
latLbl.setLayoutData(gd);
gd = new GridData(50, SWT.DEFAULT);
latSpnr = new Spinner(projectionGroup, SWT.BORDER);
latSpnr.setDigits(4);
latSpnr.setMinimum(-900000);
latSpnr.setMaximum(900000);
latSpnr.setIncrement(1000);
latSpnr.setEnabled(false);
latSpnr.setLayoutData(gd);
/*
* Lat2
*/
gd = new GridData(SWT.RIGHT, SWT.CENTER, false, true);
Label lat2Lbl = new Label(projectionGroup, SWT.NONE);
lat2Lbl.setText("Lat2: ");
lat2Lbl.setLayoutData(gd);
gd = new GridData(50, SWT.DEFAULT);
lat2Spnr = new Spinner(projectionGroup, SWT.BORDER);
lat2Spnr.setDigits(4);
lat2Spnr.setMinimum(-900000);
lat2Spnr.setMaximum(900000);
lat2Spnr.setIncrement(1000);
lat2Spnr.setEnabled(false);
lat2Spnr.setLayoutData(gd);
/*
* Lon
*/
gd = new GridData(SWT.RIGHT, SWT.CENTER, false, true);
gd.widthHint = 60;
Label lonLbl = new Label(projectionGroup, SWT.RIGHT);
lonLbl.setText("Lon: ");
lonLbl.setLayoutData(gd);
gd = new GridData(50, SWT.DEFAULT);
lonSpnr = new Spinner(projectionGroup, SWT.BORDER);
lonSpnr.setDigits(4);
lonSpnr.setMinimum(-1800000);
lonSpnr.setMaximum(1800000);
lonSpnr.setIncrement(1000);
lonSpnr.setEnabled(false);
lonSpnr.setLayoutData(gd);
}
/**
@ -622,12 +600,42 @@ public class LAPSToolsDlg extends CaveSWTDialog {
gd = new GridData(50, SWT.DEFAULT);
nxSpnr = new Spinner(gridGroup, SWT.BORDER);
nxSpnr.setDigits(0);
nxSpnr.setMinimum(1);
nxSpnr.setMaximum(100);
nxSpnr.setMinimum(61);
nxSpnr.setMaximum(301);
nxSpnr.setIncrement(1);
nxSpnr.setEnabled(false);
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());
}
});
/*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
*/
@ -641,16 +649,34 @@ public class LAPSToolsDlg extends CaveSWTDialog {
gd = new GridData(50, SWT.DEFAULT);
nySpnr = new Spinner(gridGroup, SWT.BORDER);
nySpnr.setDigits(0);
nySpnr.setMinimum(1);
nySpnr.setMaximum(100);
nySpnr.setMinimum(61);
nySpnr.setMaximum(301);
nySpnr.setIncrement(1);
nySpnr.setEnabled(false);
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());
}
});
/*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)
*/
gd = new GridData(SWT.RIGHT, SWT.CENTER, false, true);
gd.horizontalIndent = 5;
gd.widthHint = 60;
Label dxmLbl = new Label(gridGroup, SWT.RIGHT);
dxmLbl.setText("Dx(m): ");
@ -659,12 +685,29 @@ public class LAPSToolsDlg extends CaveSWTDialog {
gd = new GridData(50, SWT.DEFAULT);
dxmSpnr = new Spinner(gridGroup, SWT.BORDER);
dxmSpnr.setDigits(0);
dxmSpnr.setMinimum(1000);
dxmSpnr.setMaximum(100000);
dxmSpnr.setIncrement(1000);
dxmSpnr.setEnabled(false);
dxmSpnr.setMaximum(12500);
dxmSpnr.setIncrement(500);
dxmSpnr.setEnabled(true);
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());
}
});
/*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
*/
@ -690,39 +733,28 @@ public class LAPSToolsDlg extends CaveSWTDialog {
nzSpnr.setEnabled(false);
nzSpnr.setLayoutData(gd);
/*
* Dp(Pa)
*/
gd = new GridData(SWT.RIGHT, SWT.CENTER, false, true);
Label dppaLbl = new Label(gridGroup, SWT.NONE);
dppaLbl.setText("Dp(Pa): ");
dppaLbl.setLayoutData(gd);
}
gd = new GridData(50, SWT.DEFAULT);
dpPaSpnr = new Spinner(gridGroup, SWT.BORDER);
dpPaSpnr.setDigits(0);
dpPaSpnr.setMinimum(0);
dpPaSpnr.setMaximum(200);
dpPaSpnr.setIncrement(10);
dpPaSpnr.setEnabled(false);
dpPaSpnr.setLayoutData(gd);
/**
* Create the area group.
*/
private void createAreaGroup() {
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
Group gridGroup = new Group(configureAnalysisComp, SWT.NONE);
gridGroup.setLayout(new GridLayout(1, false));
gridGroup.setLayoutData(gd);
gridGroup.setText(" Area of Coverage ");
/*
* Low(Pa)
* Calculated Area label
*/
gd = new GridData(SWT.RIGHT, SWT.CENTER, false, true);
Label lowPaLbl = new Label(gridGroup, SWT.RIGHT);
lowPaLbl.setText("Low(Pa): ");
lowPaLbl.setLayoutData(gd);
gd = new GridData(50, SWT.DEFAULT);
lowPaSpnr = new Spinner(gridGroup, SWT.BORDER);
lowPaSpnr.setDigits(0);
lowPaSpnr.setMinimum(0);
lowPaSpnr.setMaximum(1050);
lowPaSpnr.setIncrement(10);
lowPaSpnr.setEnabled(false);
lowPaSpnr.setLayoutData(gd);
gd = new GridData(500, SWT.DEFAULT);
gd.widthHint = 500;
gd.horizontalIndent = 25;
areaStrLbl = new Label(gridGroup, SWT.HORIZONTAL);
areaStrLbl.setLayoutData(gd);
areaStrLbl.setText(data.getAreaCoverageString());
}
/**
@ -736,8 +768,7 @@ 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
@ -759,6 +790,8 @@ 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");
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
gd.widthHint = buttonWidth;
@ -769,10 +802,10 @@ public class LAPSToolsDlg extends CaveSWTDialog {
@Override
public void widgetSelected(SelectionEvent e) {
resetDomain();
}
});
resetBtn.setToolTipText("Set to the values that you started with" );
/*
* LAPS Relocator
*/
@ -780,12 +813,12 @@ public class LAPSToolsDlg extends CaveSWTDialog {
Group lapsRelocatorGroup = new Group(groupComp, SWT.NONE);
lapsRelocatorGroup.setLayout(new GridLayout(2, true));
lapsRelocatorGroup.setLayoutData(gd);
lapsRelocatorGroup.setText(" LAPS Relocator ");
lapsRelocatorGroup.setText(" LAPS Domain Viewer and Relocator ");
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
gd.widthHint = buttonWidth;
loadBtn = new Button(lapsRelocatorGroup, SWT.PUSH);
loadBtn.setText("Load");
loadBtn.setText("Load in display");
loadBtn.setLayoutData(gd);
loadBtn.addSelectionListener(new SelectionAdapter() {
@Override
@ -793,11 +826,13 @@ 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.");
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
gd.widthHint = buttonWidth;
applyBtn = new Button(lapsRelocatorGroup, SWT.PUSH);
applyBtn.setText("Apply");
applyBtn.setText("Apply changes");
applyBtn.setLayoutData(gd);
applyBtn.setEnabled(false);
applyBtn.addSelectionListener(new SelectionAdapter() {
@ -806,6 +841,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." );
}
/**
@ -842,16 +879,18 @@ public class LAPSToolsDlg extends CaveSWTDialog {
}
private void populateTypeCombo(Combo combo) {
for (String choice : LapsToolsIO.getDataChoices()) {
combo.add("-- Select a Type --");
for (String choice : LapsToolsIO.getDataChoices()) {
combo.add(choice);
}
}
private void typeAction(String type) {
try {
stText.append("Begin "+type+"\n");
stText.append(LapsToolsIO.getLogs(type));
stText.append("\n");
stText.append("__________________________________________\n");
stText.append("End of "+type);
stText.append("\n__________________________________________\n\n");
stText.setTopIndex(stText.getLineCount());
} catch (Exception ex) {
statusHandler.handle(Priority.PROBLEM,
@ -860,25 +899,23 @@ public class LAPSToolsDlg extends CaveSWTDialog {
}
private void populateSpinners() {
configureSpinner(latSpnr, data.getGridCenter().y);
configureSpinner(lat2Spnr, data.getLat2());
configureSpinner(lonSpnr, data.getLon());
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());
configureSpinner(nzSpnr, data.getNz());
configureSpinner(dpPaSpnr, data.getDp());
configureSpinner(lowPaSpnr, data.getLowp());
}
private void readSpinners() {
public void readSpinners() {
data.setGridCenterLat(readSpinner(cenLatSpnr));
data.setLat(readSpinner(cenLatSpnr));
data.setGridCenterLon(readSpinner(cenLonSpnr));
data.setNx(nxSpnr.getSelection());
data.setNy(nySpnr.getSelection());
data.setGridSpacing(readSpinner(dxmSpnr));
}
private Double readSpinner(Spinner spinner) {
@ -909,10 +946,10 @@ public class LAPSToolsDlg extends CaveSWTDialog {
private void setDefaultDomain() {
boolean ok = MessageDialog
.openConfirm(getShell(), "Confirm Exit",
"This will reset all variables to the default WFO localization values.");
"This will reset all variables to values so that the LAPS domain will fully includes the CWA area.");
if (ok) {
try {
LapsToolsIO.readDefaultParmsFile(data);
LapsToolsIO.defaultDomain(data);
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
@ -925,10 +962,10 @@ public class LAPSToolsDlg extends CaveSWTDialog {
private void resetDomain() {
boolean ok = MessageDialog
.openConfirm(getShell(), "Confirm Exit",
"This will reset all variables to the existing localization values.");
"This will reset all variables to values of the existing LAPS domain.");
if (ok) {
try {
LapsToolsIO.readParmsFile(data);
LapsToolsIO.readXmlFile(data);
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
@ -938,13 +975,26 @@ public class LAPSToolsDlg extends CaveSWTDialog {
}
private void applyAction() {
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; }
}
cenLatSpnr.setEnabled(true);
cenLonSpnr.setEnabled(true);
nxSpnr.setEnabled(true);
nySpnr.setEnabled(true);
dxmSpnr.setEnabled(true);
applyBtn.setEnabled(false);
loadBtn.setEnabled(true);
resetBtn.setEnabled(true);
defaultBtn.setEnabled(true);
localizeLapsBtn.setEnabled(true);
writeDomainBtn.setEnabled(true);
populateSpinners();
IDisplayPaneContainer container = EditorUtil.getActiveVizContainer();
@ -961,15 +1011,19 @@ public class LAPSToolsDlg extends CaveSWTDialog {
}
}
private void loadAction() {
private void loadAction() {
cenLatSpnr.setEnabled(false);
cenLonSpnr.setEnabled(false);
nxSpnr.setEnabled(false);
nySpnr.setEnabled(false);
dxmSpnr.setEnabled(false);
applyBtn.setEnabled(true);
loadBtn.setEnabled(false);
resetBtn.setEnabled(false);
defaultBtn.setEnabled(false);
localizeLapsBtn.setEnabled(false);
writeDomainBtn.setEnabled(false);
readSpinners();
GenericToolsResourceData<LapsToolLayer> rd = new GenericToolsResourceData<LapsToolLayer>(
LapsToolLayer.DEFAULT_NAME, LapsToolLayer.class);
@ -999,13 +1053,13 @@ public class LAPSToolsDlg extends CaveSWTDialog {
}
}
private void localizeLapsAction() {
private void writeXmlfileAction() {
if (MessageDialog.openQuestion(getShell(), "Confirmation",
LapsToolsIO.getLocalizationQuestion())) {
LapsToolsIO.getWriteXmlQuestion())) {
try {
LapsToolsIO.localize(data);
statusHandler.handle(Priority.SIGNIFICANT,
"Initiated LAPS Localization");
LapsToolsIO.writeXmlFile(data);
statusHandler.handle(Priority.INFO, //SIGNIFICANT
"Write EDEX domain.xml file. This action will initiated a LAPS Localization process.");
close();
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
@ -1013,4 +1067,9 @@ public class LAPSToolsDlg extends CaveSWTDialog {
}
}
}
public boolean isLapsInstalled() {
return isLapsInstalled;
}
}

View file

@ -25,12 +25,16 @@ import java.util.Arrays;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.swt.graphics.RGB;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.raytheon.uf.viz.core.DrawableCircle;
import com.raytheon.uf.viz.core.DrawableString;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.IGraphicsTarget;
//import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment;
import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle;
//import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle;
import com.raytheon.uf.viz.core.drawables.IWireframeShape;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.exception.VizException;
@ -56,6 +60,8 @@ import com.vividsolutions.jts.geom.Envelope;
* bsteffen Intial creation.
* 07-21-14 #3412 mapeters Updated deprecated drawCircle call.
* 07-29-14 #3465 mapeters Updated deprecated drawString() calls.
* Nov 2013 # mccaslin Draw more graphical boxes: for CWA, previous domain, etc
* </pre>
*
* @author bsteffen
@ -72,10 +78,16 @@ public class LapsToolLayer extends AbstractMovableToolLayer<Coordinate>
private final AbstractRightClickAction moveElementAction;
private IWireframeShape validShapeOrig;
private IWireframeShape validShape;
private IWireframeShape gridShape;
private RGB labelColor;
public static String centerLabel = "Center Point";
public LapsToolLayer(GenericToolsResourceData<LapsToolLayer> resourceData,
LoadProperties loadProperties) {
super(resourceData, loadProperties, false);
@ -129,31 +141,74 @@ public class LapsToolLayer extends AbstractMovableToolLayer<Coordinate>
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
super.paintInternal(target, paintProps);
Envelope shapeArea = data.getValidArea();
if (validShape == null) {
validShape = target.createWireframeShape(false, descriptor);
Coordinate[] coords = new Coordinate[5];
Envelope area = data.getValidArea();
coords[0] = new Coordinate(area.getMinX(), area.getMinY());
coords[1] = new Coordinate(area.getMinX(), area.getMaxY());
coords[2] = new Coordinate(area.getMaxX(), area.getMaxY());
coords[3] = new Coordinate(area.getMaxX(), area.getMinY());
coords[0] = new Coordinate(shapeArea.getMinX(), shapeArea.getMinY());
coords[1] = new Coordinate(shapeArea.getMinX(), shapeArea.getMaxY());
coords[2] = new Coordinate(shapeArea.getMaxX(), shapeArea.getMaxY());
coords[3] = new Coordinate(shapeArea.getMaxX(), shapeArea.getMinY());
coords[4] = coords[0];
validShape.addLineSegment(coords);
}
Envelope shapeArea2 = data.getValidAreaOrig();
if (validShapeOrig == null) {
validShapeOrig = target.createWireframeShape(false, descriptor);
Coordinate[] coords = new Coordinate[5];
coords[0] = new Coordinate(shapeArea2.getMinX(), shapeArea2.getMinY());
coords[1] = new Coordinate(shapeArea2.getMinX(), shapeArea2.getMaxY());
coords[2] = new Coordinate(shapeArea2.getMaxX(), shapeArea2.getMaxY());
coords[3] = new Coordinate(shapeArea2.getMaxX(), shapeArea2.getMinY());
coords[4] = coords[0];
validShapeOrig.addLineSegment(coords);
}
Envelope gridArea = data.getGridArea();
if (gridShape == null) {
gridShape = target.createWireframeShape(false, descriptor);
Coordinate[] coords = new Coordinate[5];
Envelope area = data.getGridArea();
coords[0] = new Coordinate(area.getMinX(), area.getMinY());
coords[1] = new Coordinate(area.getMinX(), area.getMaxY());
coords[2] = new Coordinate(area.getMaxX(), area.getMaxY());
coords[3] = new Coordinate(area.getMaxX(), area.getMinY());
coords[0] = new Coordinate(gridArea.getMinX(), gridArea.getMinY());
coords[1] = new Coordinate(gridArea.getMinX(), gridArea.getMaxY());
coords[2] = new Coordinate(gridArea.getMaxX(), gridArea.getMaxY());
coords[3] = new Coordinate(gridArea.getMaxX(), gridArea.getMinY());
coords[4] = coords[0];
gridShape.addLineSegment(coords);
}
//Test domain sizes
data.setLimits(false);
if (gridArea.getMinX() > shapeArea.getMinX()) {
data.setLimits(true);
} if (gridArea.getMaxX() < shapeArea.getMaxX()) {
data.setLimits(true);
} if (gridArea.getMinY() > shapeArea.getMinY()) {
data.setLimits(true);
} if (gridArea.getMaxY() < shapeArea.getMaxY()) {
data.setLimits(true);
}
RGB color = getCapability(ColorableCapability.class).getColor();
RGB color2 = color;
// Projected grid domain too small, below the limits of the CWA...
if (data.getLimits()) {
color2 = new RGB ( 250, 40, 40);
labelColor = color2;
centerLabel = "[Center point]\nFull CWA is NOT covered by domain";
} else {
labelColor = color;
centerLabel = "Center point";
}
target.drawWireframeShape(validShape, color, 1, LineStyle.DASHED_LARGE);
target.drawWireframeShape(gridShape, color, 1, LineStyle.SOLID);
target.drawWireframeShape(gridShape, color2, 1, LineStyle.SOLID);
RGB gray = new RGB ( 90, 90, 90);
target.drawWireframeShape(validShapeOrig, gray, 1, LineStyle.DASH_DOTTED);
}
@Override
@ -171,11 +226,15 @@ public class LapsToolLayer extends AbstractMovableToolLayer<Coordinate>
circle.radius = radius;
circle.basics.color = color;
target.drawCircle(circle);
//14.1.1 and earlier: target.drawCircle(center[0], center[1], 0, radius, color, 1);
double labelLoc[] = target.getPointOnCircle(center[0], center[1], 0.0,
radius, 0);
DrawableString string = new DrawableString("center point", color);
//DrawableString string = new DrawableString("center point", color);
DrawableString string = new DrawableString(centerLabel, labelColor);
string.setCoordinates(labelLoc[0], labelLoc[1]);
target.drawStrings(string);
//14.1.1 and earlier: target.drawString(null, centerLabel, labelLoc[0], labelLoc[1], 0.0,
// TextStyle.NORMAL, labelColor, HorizontalAlignment.LEFT, null);
}
@Override
@ -248,6 +307,10 @@ public class LapsToolLayer extends AbstractMovableToolLayer<Coordinate>
validShape.dispose();
validShape = null;
}
if (validShapeOrig != null) {
validShapeOrig.dispose();
validShapeOrig = null;
}
if (gridShape != null) {
gridShape.dispose();
gridShape = null;
@ -255,5 +318,54 @@ public class LapsToolLayer extends AbstractMovableToolLayer<Coordinate>
issueRefresh();
}
}
/*
@see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#project(org.opengis.
* referencing.crs.CoordinateReferenceSystem)
*/
public void project(CoordinateReferenceSystem crs) throws VizException {
if (validShape != null) {
validShape.dispose();
validShape = null;
}
if (validShapeOrig != null) {
validShapeOrig.dispose();
validShapeOrig = null;
}
if (gridShape != null) {
gridShape.dispose();
gridShape = null;
}
issueRefresh();
}
protected void drawUpperLeftCornerLabel(IGraphicsTarget target,
PaintProperties paintProps, String label) throws VizException {
// TODO this screen location code is borrowed from MPELegendResource...
// should it be put into a shared class, possibly a paint
// properties method?
IExtent screenExtent = paintProps.getView().getExtent();
double scale = (screenExtent.getHeight() / paintProps.getCanvasBounds().height);
DrawableString tmpDS = new DrawableString("0", new RGB(100, 100, 100));
tmpDS.font = null;
double textHeight = target.getStringsBounds(tmpDS).getHeight() * scale;
double padding = 3 * scale;
double textSpace = textHeight + padding;
double cmapHeight = textHeight * 1.25;
double legendHeight = cmapHeight + 2.0 * textSpace + 2.0 * padding;
double y1 = screenExtent.getMinY() + legendHeight * 2.5;
double x1 = screenExtent.getMinX() + padding * 10.0;
DrawableString string = new DrawableString(label, this.getCapability(
ColorableCapability.class).getColor());
string.basics.x = x1;
string.basics.y = y1;
string.font = null;
//string.textStyle = IGraphicsTarget.TextStyle.NORMAL;
//string.horizontalAlignment = HorizontalAlignment.LEFT;
target.drawStrings(string);
}
}

View file

@ -188,7 +188,11 @@
<includes
id="com.raytheon.uf.viz.datadelivery.feature"
version="0.0.0"/>
<includes
id="edu.wisc.ssec.cimss.viz.convectprob.feature"
version="0.0.0"/>
<requires>
<import feature="com.raytheon.uf.viz.application.feature" version="1.0.0.qualifier"/>
</requires>

View file

@ -131,6 +131,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Feb 28, 2014 2791 bsteffen Switch all data to use data source.
* Aug 21, 2014 DR 17313 jgerth Implements ImageProvider
* Oct 07, 2014 3668 bclement Renamed requestJob to requestRunner
* Dec 09, 2014 5056 jing Added data access interfaces
*
* </pre>
*
@ -150,7 +151,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
private static final double VECTOR_DENSITY_FACTOR = 1.875;
private static final int IMAGE_TILE_SIZE = 1024;
public static final String INTERROGATE_VALUE = "value";
public static final String INTERROGATE_UNIT = "unit";
@ -643,7 +644,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
public abstract List<GeneralGridData> getData(DataTime time,
List<PluginDataObject> pdos) throws VizException;
protected List<GeneralGridData> requestData(DataTime time) {
public List<GeneralGridData> requestData(DataTime time) {
synchronized (requestRunner) {
List<GeneralGridData> data = this.dataMap.get(time);
if (data == null) {
@ -968,25 +969,29 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
return new ArrayList<PluginDataObject>(list);
}
public Collection<DrawableImage> getImages(IGraphicsTarget target, PaintProperties paintProps) throws VizException {
public Collection<DrawableImage> getImages(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
if (getCapability(DisplayTypeCapability.class).getDisplayType() != DisplayType.IMAGE) {
throw new VizException("Grid resource not configured for image rendering");
throw new VizException(
"Grid resource not configured for image rendering");
}
Collection<IRenderable> renderables = getOrCreateRenderables(target, paintProps);
Collection<IRenderable> renderables = getOrCreateRenderables(target,
paintProps);
if (renderables.isEmpty()) {
return Collections.emptyList();
}
List<DrawableImage> images = new ArrayList<DrawableImage>();
for (IRenderable renderable : renderables) {
images.addAll(((TileSetRenderable)renderable).getImagesToRender(target, paintProps));
images.addAll(((TileSetRenderable) renderable).getImagesToRender(
target, paintProps));
}
return images;
}
protected Collection<IRenderable> getOrCreateRenderables(
IGraphicsTarget target, PaintProperties paintProps)
throws VizException {
throws VizException {
DataTime time = paintProps.getDataTime();
if (time == null) {
time = getTimeForResource();

View file

@ -55,6 +55,8 @@ import com.raytheon.uf.viz.datacube.DataCubeContainer;
* Sep 24, 2013 2404 bclement match criteria built using GridStyleUtil
* Jan 14, 2014 2661 bsteffen Switch vectors to u,v only.
* May 05, 2014 3026 mpduff Made getCurrentGribRecord() public
* Nov 19, 2014 5056 jing changed access modifier on getAnyGridRecord
* from private to public
*
* </pre>
*
@ -159,7 +161,7 @@ public class GridResource<T extends AbstractResourceData> extends
return (GridRecord) pdos.get(0);
}
protected GridRecord getAnyGridRecord() {
public GridRecord getAnyGridRecord() {
GridRecord record = getCurrentGridRecord();
if (record == null) {
for (DataTime time : getDataTimes()) {

View file

@ -19,6 +19,24 @@
<substitute key="elevation" value="0.5" />
<substitute key="name" value="0.5 Reflectivity" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarMosaic.xml"
menuText="0.5 Differential Refl" id="Radar05ZDR">
<substitute key="product" value="159,158" />
<substitute key="elevation" value="0.5" />
<substitute key="name" value="0.5 Diff Reflectivity" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarMosaic.xml"
menuText="0.5 Specific Diff Phase" id="Radar05KDP">
<substitute key="product" value="163,162" />
<substitute key="elevation" value="0.5" />
<substitute key="name" value="0.5 Specific Diff Phase" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarMosaic.xml"
menuText="0.5 Correlation Coeff" id="Radar05CC">
<substitute key="product" value="161,160" />
<substitute key="elevation" value="0.5" />
<substitute key="name" value="0.5 Correlation Coefficient" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarMosaic.xml"
menuText="Hybrid Scan Refl" id="RadarHybridScanRefl">
<substitute key="product" value="32,33" />

View file

@ -3,16 +3,35 @@
<contribute xsi:type="subMenu" menuText="${icao}"
id="${icao}RadarARSR4UnitStatus">
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="${icao} Z" id="${icao}ARSR4Reflectivity\">
menuText="Reflectivity (Z)" id="${icao}ARSR4Reflectivity\">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="500" />
<substitute key="elevation" value="0.0--360.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="One Hour Precip (OHP)" id="${icao}ARSR4OneHourPrecipOHP">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="78" />
<substitute key="elevation" value="0.0--0.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="Storm Total Precip (STP)" id="${icao}ARSR4StormTotalPrecipSTP">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="80" />
<substitute key="elevation" value="0.0--0.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="Hybrid Scan Refl (DHR)" id="${icao}ARSR4HybridScanReflDHR">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="32" />
<substitute key="elevation" value="0.0--0.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarXY.xml"
id="${icao}ARSR4UnitStatus" editorType="com.raytheon.viz.radar.ui.xy.RadarXYEditor" menuText="ARSR-4 Unit Status">
id="${icao}ARSR4UnitStatus" editorType="com.raytheon.viz.radar.ui.xy.RadarXYEditor"
menuText="ARSR-4 Unit Status">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="2" />
<substitute key="insetMap" value="false"/>
<substitute key="insetMap" value="false" />
</contribute>
</contribute>
</menuTemplate>

View file

@ -3,16 +3,35 @@
<contribute xsi:type="subMenu" menuText="${icao}"
id="${icao}RadarASR11UnitStatus">
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="${icao} Z" id="${icao}ASR11Reflectivity\">
menuText="Reflectivity (Z)" id="${icao}ASR11Reflectivity\">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="550" />
<substitute key="elevation" value="0.0--360.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="One Hour Precip (OHP)" id="${icao}ASR11OneHourPrecipOHP">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="78" />
<substitute key="elevation" value="0.0--0.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="Storm Total Precip (STP)" id="${icao}ASR11StormTotalPrecipSTP">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="80" />
<substitute key="elevation" value="0.0--0.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadar.xml"
menuText="Hybrid Scan Refl (DHR)" id="${icao}ASR11HybridScanReflDHR">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="32" />
<substitute key="elevation" value="0.0--0.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarXY.xml"
id="${icao}ASR11UnitStatus" editorType="com.raytheon.viz.radar.ui.xy.RadarXYEditor" menuText="ASR-11 Unit Status">
id="${icao}ASR11UnitStatus" editorType="com.raytheon.viz.radar.ui.xy.RadarXYEditor"
menuText="ASR-11 Unit Status">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="2" />
<substitute key="insetMap" value="false"/>
<substitute key="insetMap" value="false" />
</contribute>
</contribute>
</menuTemplate>

View file

@ -223,6 +223,14 @@
<substitute key="latest" value="true" />
<substitute key="elevation" value="0.0--360.0" />
</contribute>
<contribute xsi:type="bundleItem" file="bundles/DefaultRadarGraphic.xml"
menuText="Microburst AMDA (MBA)" id="${icao}MicroburstAMDA">
<substitute key="icao" value="${icao}" />
<substitute key="product" value="196" />
<substitute key="mode" value="" />
<substitute key="latest" value="true" />
<substitute key="elevation" value="0.0--360.0" />
</contribute>
<contribute xsi:type="command"
commandId="com.raytheon.viz.radar.ui.RadarDisplayControls" menuText="Radar Display Controls..."
id="${icao}GraphicsRadarDisplayControls" />

View file

@ -0,0 +1,209 @@
/**
* 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.viz.radar.interrogators;
import java.util.HashMap;
import java.util.Map;
import javax.measure.converter.UnitConverter;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import org.opengis.referencing.operation.MathTransform;
import com.raytheon.uf.common.colormap.prefs.ColorMapParameters;
import com.raytheon.uf.common.dataplugin.radar.RadarDataKey;
import com.raytheon.uf.common.dataplugin.radar.RadarDataPoint;
import com.raytheon.uf.common.dataplugin.radar.RadarRecord;
import com.raytheon.uf.common.dataplugin.radar.level3.MBAPacket.MBAAttributeIDs;
import com.raytheon.uf.common.dataplugin.radar.level3.MBAPacket.MBACategory;
import com.raytheon.uf.common.dataplugin.radar.level3.generic.AreaComponent;
import com.raytheon.uf.common.dataplugin.radar.level3.generic.GenericDataComponent;
import com.raytheon.uf.common.geospatial.CRSCache;
import com.raytheon.viz.radar.ui.RadarDisplayControls;
import com.raytheon.viz.radar.ui.RadarDisplayManager;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
/**
* Interrogator class for Radar GFM sampling.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 11/06/2014 DCS 16776 zwang Initial creation
*
* </pre>
*
* @author zwang
* @version 1.0
*/
public class RadarMBAInterrogator extends RadarGraphicInterrogator implements
IRadarInterrogator {
public RadarMBAInterrogator() {
super();
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.viz.radar.interrogators.IRadarInterrogator#sample(com.raytheon
* .edex.plugin.radar.RadarRecord, com.vividsolutions.jts.geom.Coordinate,
* com.raytheon.uf.viz.core.drawables.ColorMapParameters)
*/
@Override
public Map<String, String> sample(RadarRecord record, Coordinate latLon,
ColorMapParameters params) {
Map<String, String> dataMap = new HashMap<String, String>();
if (latLon == null) {
return null;
}
double[] input = { latLon.x, latLon.y }; // rr
double[] output = new double[2]; // rr
try {
MathTransform mt = CRSCache.getInstance().getTransformFromLatLon(
record.getCRS());
mt.transform(input, 0, output, 0, 1);
dataMap.put("crsLocation", output == null ? "-1,-1" : output[0]
+ "," + output[1]);
} catch (Exception e) {
return null;
}
dataMap.put("ICAO", record.getIcao());
dataMap.put("Mnemonic", record.getMnemonic());
addParameters(record, latLon, dataMap);
return dataMap;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.viz.radar.interrogators.IRadarInterrogator#addParameters
* (com.raytheon.uf.common.dataplugin.radar.RadarRecord,
* com.vividsolutions.jts.geom.Coordinate, java.util.Map)
*/
@Override
public int addParameters(RadarRecord radarRecord, Coordinate latLon,
Map<String, String> dataMap) {
dataMap.put("Value", getDataValues(radarRecord, latLon));
return 0;
}
private String getDataValues(RadarRecord radarRecord, Coordinate latLon) {
StringBuffer rval = new StringBuffer();
Coordinate c1 = new Coordinate(latLon.x + .025, latLon.y + .025);
Coordinate c2 = new Coordinate(latLon.x - .025, latLon.y - .025);
Envelope env = new Envelope(c1, c2);
UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND
.getConverterTo(NonSI.KNOT);
// Determine if the feature should be sampled
RadarDisplayControls currentSettings = RadarDisplayManager
.getInstance().getCurrentSettings();
if (radarRecord.getProductCode() == 196) {
for (RadarDataKey key : radarRecord.getSymbologyData().keySet()) {
Coordinate currStorm = new Coordinate(key.getLon(),
key.getLat());
if (env.contains(currStorm)) {
// Get the data for the select feature
RadarDataPoint currPoint = radarRecord.getSymbologyData()
.get(key);
AreaComponent currFeature;
HashMap<Integer, HashMap<Integer, GenericDataComponent>> currPointData = currPoint
.getDisplayGenericPointData();
for (Integer type : currPointData.keySet()) {
for (GenericDataComponent currComp : currPointData.get(
type).values()) {
currFeature = (AreaComponent) currComp;
// Category: CATEGORY
String category = currFeature
.getValue(MBAAttributeIDs.CATEGORY
.toString());
// if MBA is filtered out by category, do not sample
int catValue = category.equals("") ? 0 : Integer
.parseInt(category);
// By default, do not show MBA Wind Shear
int minCat = 1;
if (currentSettings.isMbaShowWindShear())
minCat = 0;
if (catValue >= minCat) {
// Microburst strength: DELTAV
String strength = currFeature
.getValue(MBAAttributeIDs.DELTAV.toString());
if ((strength != null) && (strength.length() > 0)) {
double strengthValue = metersPerSecondToKnots
.convert(new Double(strength));
strength = String.format("%dkts", (int) strengthValue);
}
// Maximum wind speed: MAXWINDSPEED
String maxSpeed = currFeature
.getValue(MBAAttributeIDs.MAXWINDSPEED
.toString());
if ((maxSpeed != null) && (maxSpeed.length() > 0)) {
double spdValue = metersPerSecondToKnots
.convert(new Double(maxSpeed));
maxSpeed = String.format("%dkts", (int) spdValue);
}
// Maximum shear: MAXSHEAR
String maxShear = currFeature
.getValue(MBAAttributeIDs.MAXSHEAR
.toString());
if ((maxShear != null) && (maxShear.length() > 0)) {
double shearValue = new Double(maxShear);
maxShear = String.format("%.4f/s", shearValue);
}
rval.append(MBACategory.getCatName(catValue));
rval.append(" " + maxShear);
rval.append(" maxV " + maxSpeed);
rval.append(" deltaV " + strength);
}
}
}
}
}
}
return rval.toString();
}
}

View file

@ -34,6 +34,7 @@ import com.raytheon.viz.radar.interrogators.RadarGFMInterrogator;
import com.raytheon.viz.radar.interrogators.RadarDefaultInterrogator;
import com.raytheon.viz.radar.interrogators.RadarEETInterrogator;
import com.raytheon.viz.radar.interrogators.RadarGraphicInterrogator;
import com.raytheon.viz.radar.interrogators.RadarMBAInterrogator;
import com.raytheon.viz.radar.interrogators.RadarPrecipInterrogator;
import com.raytheon.viz.radar.interrogators.RadarRadialInterrogator;
import com.raytheon.viz.radar.interrogators.RadarRasterInterrogator;
@ -60,6 +61,7 @@ import com.raytheon.viz.radar.ui.xy.RadarXsectXYResource;
* Aug 4, 2010 mnash Initial creation
* 03/04/2013 DCS51 zwang Handle GFM product
* 05/02/2013 DR 14587 D. Friedman Add isVelocityProductCode
* 09/26/2014 DCS16776 zwang Add product Microburst AMDA (MBA)
*
* </pre>
*
@ -99,6 +101,9 @@ public class RadarProductFactory {
}
else if (productCode == 140) {
interrogator = new RadarGFMInterrogator();
}
else if (productCode == 196) {
interrogator = new RadarMBAInterrogator();
} else {
interrogator = new RadarGraphicInterrogator();
}

View file

@ -41,6 +41,7 @@ import com.raytheon.uf.common.dataplugin.radar.level3.DMDPacket.DMDAttributeIDs;
import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket;
import com.raytheon.uf.common.dataplugin.radar.level3.HdaHailPacket.HdaHailPoint;
import com.raytheon.uf.common.dataplugin.radar.level3.LinkedVector;
import com.raytheon.uf.common.dataplugin.radar.level3.MBAPacket.MBAAttributeIDs;
import com.raytheon.uf.common.dataplugin.radar.level3.MesocyclonePacket.MesocyclonePoint;
import com.raytheon.uf.common.dataplugin.radar.level3.SCITDataPacket;
import com.raytheon.uf.common.dataplugin.radar.level3.SCITDataPacket.SCITDataCell;
@ -107,6 +108,7 @@ import com.vividsolutions.jts.geom.LineString;
* Aug 11, 2014 3504 mapeters Replaced deprecated IODataPreparer
* instances with IRenderedImageCallback.
* Sep 03, 2014 3574 njensen Properly dispose objects
* Nov 06, 2014 16776 zwang Handle AMDA product MBA
*
* </pre>
*
@ -443,6 +445,15 @@ public class RadarGraphicsPage implements IRenderable {
}
}
}
// MBA
else if (type == 196) {
// Handle each Feature in the MBA Packet
for (GenericDataComponent currComponent : stormData
.getDisplayGenericPointData().get(type).values()) {
// Handle Graphic portion
drawMbaImage(currComponent);
}
}
}
// Only display storm id if other information is being displayed
@ -973,6 +984,50 @@ public class RadarGraphicsPage implements IRenderable {
return images;
}
// Handle MBA product
private void drawMbaImage(GenericDataComponent currPt)
throws VizException {
double x, y;
Coordinate point;
// Determine if the feature should be rendered
RadarDisplayControls currentSettings = RadarDisplayManager
.getInstance().getCurrentSettings();
AreaComponent currFeature = (AreaComponent) currPt;
String cat = currFeature.getValue(MBAAttributeIDs.CATEGORY
.getName());
int catValue = cat.equals("") ? 0 : Integer.parseInt(cat);
// By default, do not show MBA Wind Shear
int minCat = 1;
if (currentSettings.isMbaShowWindShear())
minCat = 0;
if (catValue >= minCat) {
int numPoints = currFeature.getPoints().size();
Coordinate[] points = new Coordinate[numPoints];
// Draw Microburst cell
try {
for (int k = 0; k < numPoints; k++) {
x = currFeature.getPoints().get(k).getCoordinate1();
y = currFeature.getPoints().get(k).getCoordinate2();
// convert xy to latlon
point = referencedGfmCoord(x, y).asLatLon();
points[k] = point;
}
wireframeShape.addLineSegment(points);
} catch (TransformException e) {
throw new VizException(e);
} catch (FactoryException e) {
throw new VizException(e);
}
}
}
private PlotObject getImage(HdaHailPoint currPt) throws VizException {
PlotObject image = null;

View file

@ -0,0 +1,33 @@
package com.raytheon.viz.radar.textcontributors;
import com.raytheon.uf.common.dataplugin.radar.RadarRecord;
/**
*
* Display "SAILS" at upper text for SAILS products
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 07/08/2014 DR17356 zwang Initial creation
*
* </pre>
*
* @author zwang
* @version 1.0
*/
public class SailsTextContributor implements IRadarTextContributor {
@Override
public String contributeText(RadarRecord record) {
String sailsStr = "";
if (record.getPrimaryElevationAngle() <= 0.5 && record.getElevationNumber() > 2)
sailsStr = "SAILS";
return sailsStr;
}
}

View file

@ -39,6 +39,7 @@ import javax.xml.bind.annotation.XmlElements;
* ------------ ---------- ----------- --------------------------
* Sep 7, 2010 bsteffen Initial creation
* 03/05/2013 DCS51 zwang Handle GFM product
* 07/08/2013 DR17356 zwang Tag SAILS product
*
* </pre>
*
@ -60,6 +61,7 @@ public class UpperText {
@XmlElement(name = "productDependentDate", type = ProdDepDateTextContributor.class),
@XmlElement(name = "productDependentUSPMax", type = USPMaxTextContributor.class),
@XmlElement(name = "productDependentDVLMax", type = DigitalVilMaxTextContributor.class),
@XmlElement(name = "sails", type = SailsTextContributor.class),
@XmlElement(name = "gfmCount", type = GfmTextContributor.class),
@XmlElement(name = "srmMovement", type = SrmMovementTextContributor.class),
@XmlElement(name = "srmSource", type = SrmSourceTextContributor.class) })

View file

@ -53,6 +53,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04 DEC 2007 373 lvenable Initial creation
* 06 Nov 2014 DCS 16776 zwang Add control for MBA
*
* </pre>
*
@ -127,6 +128,11 @@ public class RadarDisplayControlDlg extends CaveSWTDialog {
*/
private Scale minFeatureScale;
/**
* Show MBA Wind Shear check box.
*/
private Button showMbaWindShear;
/**
* Overlap Mesos check box.
*/
@ -224,6 +230,8 @@ public class RadarDisplayControlDlg extends CaveSWTDialog {
addSeparator();
createDmdControls();
addSeparator();
createMbaControls();
addSeparator();
createSrmControls();
createCustomStormMotionGroup();
createCloseButton();
@ -273,6 +281,7 @@ public class RadarDisplayControlDlg extends CaveSWTDialog {
overlapMesosChk.setSelection(values.isDmdShowOverlapping());
dmdTrackToShowCbo.select(dmdTrackToShowCbo.indexOf(values
.getDmdTrackType().toString()));
showMbaWindShear.setSelection(values.isMbaShowWindShear());
stormMotionRdo.setSelection(values.getSrmSource().equals(
RadarSRMResource.SRMSource.WARNGEN));
averageStormRdo.setSelection(values.getSrmSource().equals(
@ -660,6 +669,31 @@ public class RadarDisplayControlDlg extends CaveSWTDialog {
});
}
/**
* Create the MBA controls.
*/
private void createMbaControls() {
Composite mbaComp = new Composite(shell, SWT.NONE);
GridLayout gl = new GridLayout(2, false);
mbaComp.setLayout(gl);
GridData gd = new GridData(60, SWT.DEFAULT);
Label mbaLbl = new Label(mbaComp, SWT.NONE);
mbaLbl.setFont(labelFont);
mbaLbl.setForeground(getDisplay().getSystemColor(SWT.COLOR_BLUE));
mbaLbl.setText("MBA");
mbaLbl.setLayoutData(gd);
showMbaWindShear = new Button(mbaComp, SWT.CHECK);
showMbaWindShear.setText("Show Wind Shear");
showMbaWindShear.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
values.setMbaShowWindShear(showMbaWindShear.getSelection());
}
});
}
/**
* Create the SRM radio button controls.
*/

View file

@ -29,7 +29,7 @@ import com.raytheon.viz.radar.ui.RadarDisplayManager.TrackTypes;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
*
* 11/06/2014 DCS 16776 zwang Add control for MBA
*
* </pre>
*
@ -59,6 +59,8 @@ public class RadarDisplayControls {
private boolean dmdShowOverlapping;
private TrackTypes dmdTrackType = TrackTypes.PAST_AND_FORECAST;
private boolean mbaShowWindShear;
private SRMSource srmSource;
@ -201,6 +203,25 @@ public class RadarDisplayControls {
}
}
/**
* @return the mbaShowWindShear
*/
public boolean isMbaShowWindShear() {
return mbaShowWindShear;
}
/**
* @param mbaShowWindShear
* the mbaShowWindShear to set
*/
public void setMbaShowWindShear(boolean mbaShowWindShear) {
if (mbaShowWindShear != this.mbaShowWindShear) {
this.mbaShowWindShear = mbaShowWindShear;
RadarDisplayManager.getInstance().displayConfigUpdated();
}
}
/**
* @return the srmSource
*/

View file

@ -19,8 +19,32 @@
further_licensing_information.
-->
<menuTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contribute xsi:type="menuItem" menuText="Tstorm Prob"
key="ThP" indentText="false" />
<contribute xsi:type="menuItem" menuText="Tstorm Occr"
key="CTSTM" indentText="false" />
</menuTemplate>
<contribute xsi:type="menuItem" menuText="Temperature" key="T"
indentText="false" />
contribute xsi:type="menuItem" menuText="Temp Anl Uncertainty"
key="Terranl" indentText="true" />
<contribute xsi:type="menuItem" menuText="Dewpoint" key="DpT"
indentText="true" />
<contribute xsi:type="menuItem" menuText="DpT Anl Uncertainty"
key="DpTerranl" indentText="true" />
<contribute xsi:type="menuItem" menuText="Wind" key="Wind"
indentText="false" />
<contribute xsi:type="menuItem" menuText="Wind Speed" key="wSp"
indentText="true" />
<contribute xsi:type="menuItem" menuText="WSp Anl Uncertainty"
key="wSpea" indentText="true" />
<contribute xsi:type="menuItem" menuText="Visibility" key="Vis"
indentText="false" />
<contribute xsi:type="menuItem" menuText="Sky Cover" key="TCC"
indentText="false" />
<contribute xsi:type="menuItem" menuText="Ceiling Height" key="CC"
indentText="false" />
<contribute xsi:type="menuItem" menuText="Convection Prob"
key="PROCON2hr" indentText="false" />
<contribute xsi:type="menuItem" menuText="Convection Occr"
key="CONVP2hr" indentText="false" />
<contribute xsi:type="menuItem" menuText="Lightning Prob"
key="PROLGHT2hr" indentText="false" />
<contribute xsi:type="menuItem" menuText="Lightning Occr"
key="CLGTN2hr" indentText="false" />
</menuTemplate>

View file

@ -41,7 +41,7 @@
<vbSource key="GFE" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GFS199" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GFSGuide" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GFSLAMPTstorm" name="GFSLAMP-Grid" category="SfcGrid"
<vbSource key="GFSLAMPGrid" name="GFSLAMPGrid" category="SfcGrid"
views="PLANVIEW TIMESERIES" />
<vbSource key="GLERL" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GlobalWave" category="SfcGrid" views="PLANVIEW TIMESERIES" />
@ -52,6 +52,7 @@
<vbSource key="Guam-RTMA" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GWW233" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HurWind250" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HI-MOSGuide" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HI-NamDNG5" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HI-RTMA" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HPCqpfNDFD" category="SfcGrid" views="PLANVIEW TIMESERIES" />
@ -152,4 +153,4 @@
<vbSource key="WNAwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="WNAwave4" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="WPHwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
</vbSourceList>
</vbSourceList>

View file

@ -142,12 +142,20 @@ public class VbSource {
@Override
public boolean equals(Object that) {
return that instanceof VbSource ? this.key.equals(((VbSource) that)
.getKey()) : false;
if (that instanceof VbSource) {
if ((this.key.equals(((VbSource) that).getKey()) && (this
.getCategory().compareTo(((VbSource) that).getCategory()) == 0))) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return key.hashCode();
String newKey = key.concat(category);
return newKey.hashCode();
}
}

View file

@ -87,6 +87,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
* Mar 10, 2014 2832 njensen Moved duplicated subclass's disposeInternal() logic here
* Aug 14, 2014 3523 mapeters Updated deprecated {@link DrawableString#textStyle}
* assignments.
* Dec 5, 2014 DR14944 jgerth Only set outline width when there is no existing capability
*
* </pre>
*
@ -177,7 +178,9 @@ public abstract class AbstractWWAResource extends
super(data, props);
this.recordsToLoad = new ArrayList<AbstractWarningRecord>();
resourceData.addChangeListener(this);
getCapability(OutlineCapability.class).setOutlineWidth(2);
if (!hasCapability(OutlineCapability.class)) {
getCapability(OutlineCapability.class).setOutlineWidth(2);
}
color = getCapability((ColorableCapability.class)).getColor();
this.entryMap = new ConcurrentHashMap<String, WarningEntry>();
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>gov.noaa.nws.crh.edex.grib.decoderpostprocessor</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,15 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Gribpostprocessor
Bundle-SymbolicName: gov.noaa.nws.crh.edex.grib.decoderpostprocessor
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: CRH
Require-Bundle: com.raytheon.edex.common,
com.raytheon.edex.plugin.grib,
com.raytheon.uf.common.dataplugin,
com.raytheon.uf.common.dataplugin.grid,
com.raytheon.uf.common.parameter,
com.raytheon.uf.edex.plugin.grid,
com.raytheon.uf.common.datastorage,
javax.measure
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

View file

@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.

View file

@ -0,0 +1,208 @@
package gov.noaa.nws.crh.edex.grib.decoderpostprocessor;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import com.raytheon.edex.plugin.grib.exception.GribException;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand;
import com.raytheon.uf.edex.database.DataAccessLayerException;
import com.raytheon.uf.edex.database.query.DatabaseQuery;
import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
/**
* Grib post processor implementation to generate 1-hr precipitation grids from
* the cycling (1-hr, 2-hr, 3-hr, 1-hr, 2-hr, 3-hr, etc.) precip grids in the
* NAM Nest output.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- ----------- --------------------------
* Sep 05, 2014 M. Foster Initial Creation
*
*
* </pre>
*
* @author matthew.foster
* @version 1.0
*/
public class NamNestPostProcessor extends OneHrPrecipGridProcessor {
@Override
public GridRecord[] process(GridRecord record) throws GribException {
// Post process the data if this is a Total Precipitation grid
if (record.getParameter().getAbbreviation().equals("TP2hr") ||
record.getParameter().getAbbreviation().equals("TP3hr")) {
return super.process(record);
}
return new GridRecord[] { record };
}
/**
* Retrieves a grid inventory for the provided datasetid and parameter
*
* @param datasetid
* The datasetid of the model being worked on
* @param parm
* The parameter being retrieved (e.g. TP3hr)
* @param refTime
* The refTime (cycle time) of the model
* @return A List of GridRecord
* @throws GribException
*/
@SuppressWarnings("unchecked")
protected List<GridRecord> getPrecipInventory(String datasetid,
String parm, Date refTime) throws GribException {
GridDao dao = null;
try {
dao = new GridDao();
} catch (PluginException e) {
throw new GribException("Error instantiating grib dao!", e);
}
DatabaseQuery query = new DatabaseQuery(GridRecord.class);
query.addQueryParam(GridConstants.PARAMETER_ABBREVIATION, parm);
query.addQueryParam(GridConstants.DATASET_ID, datasetid);
query.addQueryParam("dataTime.refTime", refTime);
query.addOrder("dataTime.fcstTime", true);
try {
return (List<GridRecord>) dao.queryByCriteria(query);
} catch (DataAccessLayerException e) {
throw new GribException(
String.format("Error getting Precip inventory for %s!",
datasetid), e);
}
}
/**
*
* @param refTime
* The reftime (cycle time) of the model being worked on
* @return List of Integer of the fcstTimes of the current 1hr precip
* inventory
* @throws GribException
*/
@SuppressWarnings("unchecked")
protected HashSet<Integer> getPrecip1hrInventory(String datasetId, Date refTime)
throws GribException {
GridDao dao = null;
try {
dao = new GridDao();
} catch (PluginException e) {
throw new GribException("Error instantiating grib dao!", e);
}
DatabaseQuery query = new DatabaseQuery(GridRecord.class);
query.addQueryParam(GridConstants.PARAMETER_ABBREVIATION, "TP1hr");
query.addQueryParam(GridConstants.DATASET_ID, datasetId,
QueryOperand.EQUALS);
query.addQueryParam("dataTime.refTime", refTime);
query.addReturnedField("dataTime.fcstTime");
query.setDistinct(true);
try {
return new HashSet<Integer>((List<Integer>) dao.queryByCriteria(query));
} catch (DataAccessLayerException e) {
throw new GribException(
"Error getting Precip inventory for NAMNest!", e);
}
}
/**
* Generates the 1 hour accumulated grid from the run accumulated
* precipitation grids. This function will look in the inventory and
* generate any 1 hr grids that can be generated.
*
* @param record
* The grib record for which to generate the 1 hour accumulated
* precipitation grid
* @return The generated 1-hr precipitation grids
* @throws GribException
*/
protected synchronized GridRecord[] generate1hrPrecipGrids(GridRecord record)
throws GribException {
List<GridRecord> currInventory;
List<GridRecord> prevInventory;
HashSet<Integer> precip1hrInventory;
if (record.getParameter().getAbbreviation().equals("TP3hr")) {
// Get an inventory of TP3hr grids
currInventory = getPrecipInventory(record.getDatasetId(), "TP3hr",
record.getDataTime().getRefTime());
// Get an inventory of TP2hr grids
prevInventory = getPrecipInventory(record.getDatasetId(), "TP2hr",
record.getDataTime().getRefTime());
// The current 1hr precip inventory
precip1hrInventory = getPrecip1hrInventory(record.getDatasetId(),
record.getDataTime().getRefTime());
} else if (record.getParameter().getAbbreviation().equals("TP2hr")) {
// Get an inventory of TP2hr grids
currInventory = getPrecipInventory(record.getDatasetId(), "TP2hr",
record.getDataTime().getRefTime());
// Get an inventory of TP1hr grids
prevInventory = getPrecipInventory(record.getDatasetId(), "TP1hr",
record.getDataTime().getRefTime());
precip1hrInventory = new HashSet<Integer>();
for (GridRecord rec : prevInventory) {
precip1hrInventory.add(rec.getDataTime().getFcstTime());
}
} else {
throw new GribException("Didn't get TP3hr or TP2hr grid");
}
// Adds the current record to the precip inventory
float[] currentData = (float[]) record.getMessageData();
record.setMessageData(currentData);
currInventory.add(record);
// Examine each grid in the inventory and generate the 1hr precipitation
// grid if possible
List<GridRecord> generatedRecords = new ArrayList<GridRecord>();
for (GridRecord currRecord : currInventory) {
// Check if the 1hr precipitation grid has already been produced
if (! precip1hrInventory.contains(currRecord.getDataTime()
.getFcstTime())) {
List<GridRecord> generated1hrPrecips = generate1hrPrecip(
currRecord, prevInventory);
for (GridRecord newRecord : generated1hrPrecips) {
// Add the generated grid to the current inventory
if (newRecord != null) {
precip1hrInventory.add(newRecord.getDataTime()
.getFcstTime());
generatedRecords.add(newRecord);
}
}
}
}
return generatedRecords.toArray(new GridRecord[] {});
}
/**
* Calculates the new data by subtracting the previous inventory data from
* the current data
*
* @param inventoryData
* The data from the previous precipitation record
* @param newData
* The data from the current precipitation record
*/
protected void calculatePrecipValues(float[] inventoryData, float[] newData) {
for (int i = 0; i < inventoryData.length; i++) {
newData[i] = newData[i] - inventoryData[i];
if (newData[i] < 0) {
newData[i] = 0;
}
}
}
}

View file

@ -0,0 +1,184 @@
package gov.noaa.nws.crh.edex.grib.decoderpostprocessor;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.raytheon.edex.plugin.grib.decoderpostprocessors.IDecoderPostProcessor;
import com.raytheon.edex.plugin.grib.exception.GribException;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
import com.raytheon.uf.common.parameter.Parameter;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
/**
* Abstract class to generate 1-hour precip grids
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- ------------- --------------------------
* Sep 05, 2014 M. Foster Initial creation
*
* </pre>
*
* @author matthew.foster
* @version 1.0
*
*/
public abstract class OneHrPrecipGridProcessor implements IDecoderPostProcessor {
/** The number of seconds in 1 hour */
protected static final int SECONDS_IN_1_HR = 3600;
public GridRecord[] process(GridRecord record) throws GribException {
// Post process the data if this is a 2hr or 3hr precip accumulation
GridRecord[] newRecords = generate1hrPrecipGrids(record);
GridRecord[] retVal = new GridRecord[newRecords.length + 1];
retVal[0] = record;
for (int i = 1; i < retVal.length; i++) {
retVal[i] = newRecords[i - 1];
}
return retVal;
}
protected abstract GridRecord[] generate1hrPrecipGrids(GridRecord record)
throws GribException;
/**
* Generates the 1hr precipitation grid
*
* @param record
* The current record to clone and modify to produce the new 1hr
* grid
* @param precipInventory
* The current run accumulated grid inventory
* @return The generated 1hr precipitation grid
* @throws GribException
*/
protected List<GridRecord> generate1hrPrecip(GridRecord record,
List<GridRecord> precipInventory)
throws GribException {
List<GridRecord> tp1hrRecords = new ArrayList<GridRecord>();
int currentFcstTime = record.getDataTime().getFcstTime();
for (GridRecord rec : precipInventory) {
if (rec.getDataTime().getFcstTime() == (currentFcstTime - SECONDS_IN_1_HR)) {
tp1hrRecords.add(calculate1hrPrecip(rec, record));
}
}
return tp1hrRecords;
}
/**
* Generates the 1hr precipitation grid from the current grid and the
* previous grid
*
* @param inventoryRecord
* The previous grid from the inventory
* @param currentRecord
* The current grid
* @return The generated 1hr precipitation grid
* @throws GribException
*/
protected GridRecord calculate1hrPrecip(GridRecord inventoryRecord,
GridRecord currentRecord) throws GribException {
// Clone the current record and set the ID to 0 so Hibernate will
// recognize it as a new record
GridRecord tp1hrRecord = new GridRecord(currentRecord);
tp1hrRecord.setId(0);
if (currentRecord.getMessageData() == null) {
GridDao dao = null;
try {
dao = new GridDao();
currentRecord.setMessageData(((FloatDataRecord) dao
.getHDF5Data(currentRecord, -1)[0]).getFloatData());
} catch (PluginException e) {
throw new GribException("Error populating grib data!", e);
}
}
// Copy the data to the new record so the data from the original record
// does not get modified
float[] currentData = (float[]) currentRecord.getMessageData();
currentRecord.setMessageData(currentData);
float[] newData = new float[currentData.length];
System.arraycopy(currentData, 0, newData, 0, currentData.length);
tp1hrRecord.setMessageData(newData);
// Assign the new parameter abbreviation and cache it if necessary
Parameter param = new Parameter("TP1hr", "Precip Accum 1 hr",
currentRecord.getParameter().getUnit());
tp1hrRecord.setParameter(param);
tp1hrRecord.getInfo().setId(null);
// Change the data time to include the 1-hr time range
modifyDataTime(tp1hrRecord);
// Calculate the new data values
if (inventoryRecord != null) {
if (inventoryRecord.getMessageData() == null) {
GridDao dao = null;
try {
dao = new GridDao();
inventoryRecord
.setMessageData(((FloatDataRecord) dao.getHDF5Data(
inventoryRecord, 0)[0]).getFloatData());
} catch (PluginException e) {
throw new GribException("Error populating grib data!", e);
}
}
calculatePrecipValues((float[]) inventoryRecord.getMessageData(),
(float[]) tp1hrRecord.getMessageData());
}
return tp1hrRecord;
}
/**
* Calculates the new data by subtracting the previous inventory data from
* the current data
*
* @param inventoryData
* The data from the previous precipitation record
* @param newData
* The data from the current precipitation record
*/
protected abstract void calculatePrecipValues(float[] messageData,
float[] messageData2);
/**
* Modifies the DataTime of the provided record to include a 1hr time range
*
* @param record
* The record to modify the datatime for
*/
protected void modifyDataTime(GridRecord record) {
Calendar refTime = record.getDataTime().getRefTimeAsCalendar();
int fcstTime = record.getDataTime().getFcstTime();
// Calculate the start time by subtracting 1 hour from the reference
// time + forecast time
Calendar startTime = (Calendar) refTime.clone();
startTime.add(Calendar.SECOND, fcstTime - SECONDS_IN_1_HR);
// Calculate the end time by adding the reference time + forecast time
Calendar endTime = (Calendar) refTime.clone();
endTime.add(Calendar.SECOND, fcstTime);
TimeRange validPeriod = new TimeRange(startTime, endTime);
DataTime newDataTime = new DataTime(refTime, fcstTime, validPeriod);
// Reset the datauri since the datauri contains the DataTime
record.setDataTime(newDataTime);
record.setDataURI(null);
}
}

View file

@ -1,9 +1,9 @@
edex.root.directory=/awips2/edex
architecture=x86_64
includegen.filter=raytheon|noaa\.nws|noaa\.gsd
includegen.filter=raytheon|noaa\.nws|noaa\.gsd|gov\.nasa\.msfc|edu\.wisc\.ssec\.cimss
# AWIPSII core repositores required for build
# AWIPSII core repositories required for build
core.repositories=ufcore,ufcore-foss,AWIPS2_foss
# Note: currently, there is a limit of 99 plugin directories.
@ -22,6 +22,8 @@ dir.11=features
dir.12=viz
# directories from ufcore-foss
dir.13=lib
# CIMSS plug-in directory
dir.14=CIMSS
# the directory that contains the localization projects

View file

@ -71,12 +71,12 @@
<includes
id="com.raytheon.uf.edex.archive.feature"
version="0.0.0"/>
<!-- Comment out this include before checking in. This plugin only for debugging. -->
<!--
<includes
id="com.raytheon.uf.edex.archive.feeder.feature"
version="0.0.0"/>
version="0.0.0"/>
-->
<includes
@ -107,7 +107,7 @@
id="com.raytheon.uf.edex.ncep.feature"
version="0.0.0"/>
<!-- Uncomment to deploy the National Central Operations EDEX plugins locally -->
<!-- Uncomment to deploy the National Central Operations EDEX plugins locally -->
<!-- includes
id="com.raytheon.uf.edex.ncep.nco.feature"
version="0.0.0"/-->
@ -119,7 +119,7 @@
<includes
id="com.raytheon.uf.edex.ost.feature"
version="0.0.0"/>
<includes
id="com.raytheon.uf.edex.npp.feature"
version="0.0.0"/>
@ -136,4 +136,12 @@
id="com.raytheon.uf.edex.remote.script.feature"
version="0.0.0"/>
<includes
id="gov.nasa.msfc.sport.edex.sportlma.feature"
version="0.0.0"/>
<includes
id="edu.wisc.ssec.cimss.edex.convectprob.feature"
version="0.0.0"/>
</feature>

View file

@ -134,14 +134,15 @@ public class BinLightningDecoder extends AbstractDecoder {
private static DecryptedLightningValidator validator = new DecryptedLightningValidator() {
@Override
public boolean isValid(byte[] decryptedData) {
return BinLightningDecoderUtil.isKeepAliveRecord(decryptedData) == false
&& BinLightningDecoderUtil
.isLightningDataRecords(decryptedData) == false;
return BinLightningDecoderUtil.isKeepAliveRecord(decryptedData)
|| BinLightningDecoderUtil
.isLightningDataRecords(decryptedData);
/*
* use this if keep-alive record could be mixed with lightning
* records
*/
// return BinLigntningDecoderUtil.isValidMixedRecordData(decryptedData) == false
// return
// BinLigntningDecoderUtil.isValidMixedRecordData(decryptedData);
}
};

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aliasList caseSensitive="true" namespace="gfeParamInfo">
<alias base="MOSGuide-HI">mosGuideNDFD</alias>
<alias base="GFS217">gfs20km</alias>
<alias base="GFS215">gfs20km</alias>
<alias base="GFS20-PAC">gfs20km</alias>
@ -166,7 +167,7 @@
<alias base="OPCWave182">opcWave182</alias>
<alias base="MOSGuide">mosGuideNDFD</alias>
<alias base="MOSGuide-AK">mosGuideNDFD_AK</alias>
<alias base="GFSLAMPTstorm">lampNDFD</alias>
<alias base="GFSLAMPGrid">lampNDFD</alias>
<alias base="TPCSurgeProb">TPCSurgeProb</alias>
<alias base="TPCSurgeProb197">TPCSurgeProb</alias>
<alias base="TPCSurgeProb-AK">TPCSurgeProb</alias>

View file

@ -7,6 +7,7 @@
Jul 03, 2013 #2044 randerso Removed mappings from tpXXX to tp_XXX for RFCQPF
Mar 31, 2014 #2934 dgilling Updated params for pSurge2.0/PHISH data.
Jul 03, 2014 DR 14068 mfoster Added parameters for 3km AK-RTMA
Dec 15, 2014 DR 14024 jwatson Added parameters for 2.5km GFSLAMPGrid
-->
<aliasList caseSensitive="true" namespace="gfeParamName">
<alias base="AV">av</alias>
@ -132,6 +133,8 @@
<alias base="Cigc1">cigc1</alias>
<alias base="Cigc2">cigc2</alias>
<alias base="Cigc3">cigc3</alias>
<alias base="CLGTN">clgtn</alias>
<alias base="CONVP">convp</alias>
<alias base="CP2hr">cp2hr</alias>
<alias base="CPVV">cpvv</alias>
<alias base="CRAINc1">crainc1</alias>
@ -221,6 +224,8 @@
<alias base="Prob34">prob34</alias>
<alias base="Prob50">prob50</alias>
<alias base="Prob64">prob64</alias>
<alias base="PROCON">procon</alias>
<alias base="PROLGHT">prolght</alias>
<alias base="PTAM">ptam</alias>
<alias base="PTAN">ptan</alias>
<alias base="PTA">pta</alias>

View file

@ -390,6 +390,9 @@ ExtraWEPrecision = []
AstroTide = ("AstroTide", SCALAR, "ft", "Astro Tide", 20.0, -8.0, 1, NO)
StormSurge = ("StormSurge", SCALAR, "ft", "Storm Surge", 30.0, -5.0, 1, NO)
# Parm for Aviation/GFSLAMPGrid
ClgHgt=("ClgHgt",SCALAR,"ft","Ceiling Height",25000.0,-100.0,0,NO)
#---------------------------------------------------------------------------
#
# Weather configuration section
@ -1096,6 +1099,7 @@ NamDNG5 = ('NamDNG5', GRID, '', NO, NO, 2, 0)
TPCProb = ('TPCProb', GRID, '', NO, NO, 30, 0)
SREF = ('SREF', GRID, '', NO, NO, 3, 0)
ENPwave = ('ENPwave', GRID, '', NO, NO, 2, 0)
GFSLAMPGrid = ('GFSLAMPGrid', GRID, '', NO, NO, 3, 0)
#---------------------------------------------------------------------------
#
# D2D Model Database Version Specification
@ -1182,6 +1186,7 @@ elif SID == "HFO":
'WPHwave10',
'NPHwave4',
'GLOBHwave',
('MOSGuide-HI', 'MOSGuide'),
('nwpsCG1', 'nwpsCG1'),
('nwpsTrkngCG0', 'nwpsTrkngCG0'),
('GFS20-PAC', 'GFS20'),
@ -1294,6 +1299,7 @@ elif SID in CONUS_EAST_SITES:
'GLOBHwave',
'URMA25',
('GFS215', 'GFS20'),
'GFSLAMPGrid',
('FFG-ALR', 'FFGALR'),
('FFG-FWR', 'FFGFWR'),
('FFG-KRF', 'FFGKRF'),
@ -1369,6 +1375,7 @@ else: #######DCS3501 WEST_CONUS
'GLOBHwave',
'URMA25',
('GFS215', 'GFS20'),
'GFSLAMPGrid',
('FFG-ALR', 'FFGALR'),
('FFG-FWR', 'FFGFWR'),
('FFG-KRF', 'FFGKRF'),
@ -1547,6 +1554,7 @@ elif SID == "HFO":
# "gfsLR" : ["gfsLR"],
"RTMA": ['RTMA'],
"NamDNG5" : ["NamDNG5"],
"MOSGuide" : ['MOSGuide'],
"nwpsCG1" : ['nwpsCG1'],
"nwpsTrkngCG0" : ['nwpsTrkngCG0'],
}
@ -1631,6 +1639,7 @@ else:
# "WNAwave4" : ["WNAwave4"],
# "ENPwave": ["ENPwave"],
"ESTOFS" : ["ESTOFS"],
"GFSLAMPGrid" : ["GFSLAMPGrid"],
"nwpsCG1" : ['nwpsCG1'],
"nwpsTrkngCG0" : ['nwpsTrkngCG0'],
}
@ -1656,7 +1665,7 @@ D2DAccumulativeElements= {
"GFS80": ["tp", "cp"],
"GFS75": ["tp", "cp"],
"GFS190": ["tp", "cp"],
"HRRR": ["tp1hr", "crain", "csnow", "cfrzr", "cicep"],
"HRRR": ["tp", "crain", "csnow", "cfrzr", "cicep"],
"NAM95": ["tp", "cp"],
"NAM80": ["tp", "cp"],
"NAM40": ["tp", "cp"],
@ -1774,9 +1783,11 @@ localRTMAParms = []
localNamDNG5Parms = []
localSREFParms = []
localTPCProbParms = []
localHRRRParms = localESTOFSParms = []
localGFSLAMPGridParms = []
localHRRRParms = []
localESTOFSParms = []
localnwpsCG1Parms = []
localnwpsTrkngCG0Parms = []
localnwpsTrkngCG0Parms = []
localISCExtraParms = []
myOfficeType = SITES[GFESUITE_SITEID][5]
@ -1850,6 +1861,7 @@ if not BASELINE and siteImport('localConfig'):
localWNAwave10Parms = getattr(localConfig, 'parmsWNAwave10', localWNAwave10Parms)
localWNAwave4Parms = getattr(localConfig, 'parmsWNAwave4', localWNAwave4Parms)
localENPwaveParms = getattr(localConfig, 'parmsENPwave', localENPwaveParms)
localGFSLAMPGridParms = getattr(localConfig, 'parmsGFSLAMPGrid', localGFSLAMPGridParms)
#note that extraISCparms are not in the standard format. These
#are a list of ([p, p, p, p], officeType)
localISCExtraParms = getattr(localConfig, 'extraISCparms', localISCExtraParms)
@ -2041,6 +2053,10 @@ parmsGFS40 = [([SnowRatio], TC1)]
ENPwave_parms = [([WindWaveHeight, WaveHeight, SurfHeight, Wind], TC6),
([Swell, Swell2, Period, Period2], TC6)]
# GFSLAMPGrid
parmsGFSLAMPGrid=[([Temp, Td, serverConfig.Vis, ClgHgt],TC1)]
#---------------------------------------------------------------------------
# Databases for a site.
# list of (Database, [parms])
@ -2101,6 +2117,7 @@ DATABASES = [(Official, OFFICIALDBS + localParms),
(NamDNG5, NamDNG5PARMS + localNamDNG5Parms),
(TPCProb, TPCProbPARMS + localTPCProbParms),
(ENPwave, ENPwave_parms + localENPwaveParms),
(GFSLAMPGrid, GFSLAMPGridPARMS + localGFSLAMPGridParms),
(Test, OFFICIALDBS + localParms)] + localDBs
# Intersite coordination database parameter groupings, based on

View file

@ -1,76 +1,304 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>10800</fcst>
<fcst>14400</fcst>
<fcst>18000</fcst>
<fcst>21600</fcst>
<fcst>25200</fcst>
<fcst>28800</fcst>
<fcst>32400</fcst>
<fcst>36000</fcst>
<fcst>39600</fcst>
<fcst>43200</fcst>
<fcst>46800</fcst>
<fcst>50400</fcst>
<fcst>54000</fcst>
<fcst>57600</fcst>
<fcst>61200</fcst>
<fcst>64800</fcst>
<fcst>68400</fcst>
<fcst>72000</fcst>
<fcst>75600</fcst>
<fcst>79200</fcst>
<fcst>82800</fcst>
<fcst>86400</fcst>
<fcst>90000</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ctstm</short_name>
<long_name>Categorical Thunder Storm</long_name>
<units>yn</units>
<udunits/>
<uiname>CategoricalTSTM</uiname>
<valid_range>0.0</valid_range>
<valid_range>1.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticTopo</short_name>
<long_name>Topography</long_name>
<units>meters</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>thp</short_name>
<long_name>Thunderstorm Probability</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>TstrmProb</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>3600</fcst>
<fcst>7200</fcst>
<fcst>10800</fcst>
<fcst>14400</fcst>
<fcst>18000</fcst>
<fcst>21600</fcst>
<fcst>25200</fcst>
<fcst>28800</fcst>
<fcst>32400</fcst>
<fcst>36000</fcst>
<fcst>39600</fcst>
<fcst>43200</fcst>
<fcst>46800</fcst>
<fcst>50400</fcst>
<fcst>54000</fcst>
<fcst>57600</fcst>
<fcst>61200</fcst>
<fcst>64800</fcst>
<fcst>68400</fcst>
<fcst>72000</fcst>
<fcst>75600</fcst>
<fcst>79200</fcst>
<fcst>82800</fcst>
<fcst>86400</fcst>
<fcst>90000</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>tcc</short_name>
<long_name>Sky Cover</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>totalCldCvr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>vis</short_name>
<long_name>visibility</long_name>
<units>m</units>
<udunits>meter</udunits>
<uiname>visibility</uiname>
<valid_range>0.0</valid_range>
<valid_range>5000.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>cc</short_name>
<long_name>Cloud Ceiling</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>cloudCeiling</uiname>
<valid_range>0.0</valid_range>
<valid_range>10000.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>CLG</levelsDesc>
<levels>
<level>CLG</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>procon</short_name>
<long_name>Convection Probability</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ConvProb</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>convp</short_name>
<long_name>Categorical Convection potential</long_name>
<units>yn</units>
<udunits/>
<uiname>CategoricalCONV</uiname>
<valid_range>0.0</valid_range>
<valid_range>8.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>prolght</short_name>
<long_name>Lightning Probability</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>LgtnProb</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>clgtn</short_name>
<long_name>Categorical Lightning potential</long_name>
<units>yn</units>
<udunits/>
<uiname>CategoricalLGTN</uiname>
<valid_range>0.0</valid_range>
<valid_range>8.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>dpt</short_name>
<long_name>Dewpoint Temperature</long_name>
<units>K</units>
<udunits>degree_Kelvin</udunits>
<uiname>Td</uiname>
<valid_range>180.0</valid_range>
<valid_range>330.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 2</levelsDesc>
<levels>
<level>FHAG2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>dpterranl</short_name>
<long_name>Dewpoint Temperature error analysis</long_name>
<units>K</units>
<udunits>degree_Kelvin</udunits>
<uiname>TdErrorAnalysis</uiname>
<valid_range>-330.0</valid_range>
<valid_range>330.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 2</levelsDesc>
<levels>
<level>FHAG2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>t</short_name>
<long_name>Temperature</long_name>
<units>K</units>
<udunits>degree_Kelvin</udunits>
<uiname>T</uiname>
<valid_range>180.0</valid_range>
<valid_range>330.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 2</levelsDesc>
<levels>
<level>FHAG2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>terranl</short_name>
<long_name>Temperature error analysis</long_name>
<units>K</units>
<udunits>degree_Kelvin</udunits>
<uiname>ErrorAnalysisT</uiname>
<valid_range>-330.0</valid_range>
<valid_range>330.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 2</levelsDesc>
<levels>
<level>FHAG2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 10</levelsDesc>
<levels>
<level>FHAG10</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>wserranl</short_name>
<long_name>wind speed uncertainty</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>WSerranlind</uiname>
<valid_range>0.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 10</levelsDesc>
<levels>
<level>FHAG10</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>wd</short_name>
<long_name>Wind direction (from which blowing)</long_name>
<units>deg</units>
<udunits>degrees</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 10</levelsDesc>
<levels>
<level>FHAG10</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>wderranl</short_name>
<long_name>wind dir uncertainty</long_name>
<units>deg</units>
<udunits>degrees</udunits>
<uiname>WDerranlind</uiname>
<valid_range>-360.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 10</levelsDesc>
<levels>
<level>FHAG10</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 10</levelsDesc>
<levels>
<level>FHAG10</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>FHAG 10</levelsDesc>
<levels>
<level>FHAG10</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>m</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>staticTopo</short_name>
<long_name>Topography</long_name>
<units>meters</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,33 @@
################################################################################
# This file contains entries for the 2.5km Gridded LAMP database initialization.
#
# Author: Joshua Watson Created: 09/28/2011
# ERH Last Modified: 12/12/2014
#
################################################################################
# Import existing model database initialization parameters
from Init import *
class GFSLAMPForecaster(Forecaster):
def __init__(self):
Forecaster.__init__(self, "GFSLAMP","GFSLAMP")
def calcClgHgt(self, cc_CLG):
ceil = cc_CLG * 3.280839
ceil = where(less(cc_CLG, 0), -99., ceil)
return ceil
def calcVis(self, vis_SFC):
return (vis_SFC * 3.2808) / 5279.85564
def calcT(self, t_FHAG2):
return self.KtoF(t_FHAG2)
def calcTd(self, dpt_FHAG2):
return self.KtoF(dpt_FHAG2)
################################################################################
# Set this file up to run with SmartInitialization
def main():
GFSLAMPForecaster().run()

View file

@ -133,6 +133,8 @@ logHandler = UFStatusHandler.UFStatusHandler("com.raytheon.edex.plugin.grib", "E
# Apr 28, 2014 3084 bsteffen Use full grid for looking up parameter aliases.
# Aug 15, 2014 15699 MPorricelli Import GridUtil and update reference
# to GRID_FILL_VALUE
# Dec 15, 2014 DR16509 Matt Foster Changes in _decodePdsSection to accommodate
# EKDMOS
#
class GribDecoder():
@ -565,17 +567,23 @@ class GribDecoder():
#numMissingValues = pdsTemplate[22]
#statisticalProcess = pdsTemplate[23]
elif pdsTemplateNumber == 10:
elif pdsTemplateNumber == 6 or pdsTemplateNumber == 10:
# pdsTemplate 6 and 10 are used for percentile-based variables
# 6 is for instantaneous variables, 10 is for those that span
# a time range
parameterAbbreviation = parameterAbbreviation + str(pdsTemplate[15]) + "pct"
gribDict['parameterName'] = str(pdsTemplate[15]) +"th percentile " + gribDict['parameterName']
gribDict['endTime'] = self._convertToCalendar(pdsTemplate, 16)
#numTimeRanges = pdsTemplate[22]
#numMissingValues = pdsTemplate[23]
#statisticalProcess = pdsTemplate[24]
typeOfTimeInterval = pdsTemplate[25]
durationSecs = self._convertToSeconds(pdsTemplate[27], pdsTemplate[26])
if pdsTemplateNumber == 10:
# Add time range information for pdsTemplate 10
gribDict['endTime'] = self._convertToCalendar(pdsTemplate, 16)
#numTimeRanges = pdsTemplate[22]
#numMissingValues = pdsTemplate[23]
#statisticalProcess = pdsTemplate[24]
typeOfTimeInterval = pdsTemplate[25]
durationSecs = self._convertToSeconds(pdsTemplate[27], pdsTemplate[26])
if durationSecs is not None:

View file

@ -912,8 +912,13 @@
<dt>3</dt>
</info>
<info>
<title>GFSLAMP-Grid</title>
<datasetId>GFSLAMPTstorm</datasetId>
<title>HI-GriddedMOS</title>
<datasetId>MOSGuide-HI</datasetId>
<dt>3</dt>
</info>
<info>
<title>GFSLAMPGrid</title>
<datasetId>GFSLAMPGrid</datasetId>
<dt>1</dt>
</info>
<info>

View file

@ -52,12 +52,17 @@ TP_T170L42A-NCEP-MDL_1073x689_43200-0 TP12hr
ThP_T170L42A-NCEP-MDL_1073x689_43200-0 ThP12hr
ThP_T170L42A-NCEP-MDL_1073x689_21600-0 ThP6hr
ThP_T170L42A-NCEP-MDL_1073x689_10800-0 ThP3hr
// GFSLAMPGrid 2.5km
ThP_LAMP-NCEP-MDL_2145x1377_7200-0 PROLGHT2hr
// 2.5km MOSGuide
TP0.254mm_T170L42A-NCEP-MDL_2145x1377_21600-0 POP6hr
TP0.254mm_T170L42A-NCEP-MDL_2145x1377_43200-0 POP12hr
// MOSGuide Alaska
TP0.254mm_T170L42A-NCEP-MDL_1649x1105_21600-0 POP6hr
TP0.254mm_T170L42A-NCEP-MDL_1649x1105_43200-0 POP12hr
// MOSGuide Hawaii
TP0.254mm_T170L42A-NCEP-MDL_625x561_21600-0 POP6hr
TP0.254mm_T170L42A-NCEP-MDL_625x561_43200-0 POP12hr
// TPCWindProb wind speed probabilities
WS17.491m/s Prob34
WS25.722m/s Prob50

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<polarStereoGridCoverage>
<name>400</name>
<description>LAPS Grid</description>
<firstGridPointCorner>LowerLeft</firstGridPointCorner>
<minorAxis>6367470.0</minorAxis>
<majorAxis>6367470.0</majorAxis>
<nx>125</nx>
<ny>125</ny>
<la1>39.432804</la1>
<lo1>-75.739328</lo1>
<lov>-72.208576</lov>
<lad>42.274424</lad>
<dx>5</dx>
<dy>5</dy>
<spacingUnit>km</spacingUnit>
</polarStereoGridCoverage>

View file

@ -18,19 +18,20 @@
See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for
further_licensing_information.
-->
<polarStereoGridCoverage>
<name>87</name>
<description>U.S. Area; used in MAPS/RUC (60km at 40N) (N. Hem.
polar stereographic)</description>
<la1>22.8756</la1>
<lo1>-120.4911</lo1>
<mercatorGridCoverage>
<name>625561001</name>
<description>NDGD grid over - Hawaii (Mercator)</description>
<la1>14.3515</la1>
<lo1>-164.9695</lo1>
<firstGridPointCorner>LowerLeft</firstGridPointCorner>
<nx>81</nx>
<ny>62</ny>
<dx>68.153</dx>
<dy>68.153</dy>
<nx>625</nx>
<ny>561</ny>
<dx>2.5</dx>
<dy>2.5</dy>
<spacingUnit>km</spacingUnit>
<minorAxis>6371229.0</minorAxis>
<majorAxis>6371229.0</majorAxis>
<lov>-105.0</lov>
</polarStereoGridCoverage>
<minorAxis>6371200.0</minorAxis>
<majorAxis>6371200.0</majorAxis>
<latin>20.0</latin>
<la2>26.8605</la2>
<lo2>-150.0402</lo2>
</mercatorGridCoverage>

View file

@ -28,7 +28,6 @@
<name>LAPS</name>
<center>59</center>
<subcenter>0</subcenter>
<grid>400</grid>
<process>
<id>103</id>
</process>
@ -36,4 +35,4 @@
<!-- END SUBCENTER 0 -->
</gribModelSet>
</gribModelSet>

View file

@ -1509,7 +1509,6 @@
<name>MSAS</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>87</grid>
<process>
<id>100</id>
</process>
@ -3155,7 +3154,7 @@
<name>MOSGuide</name>
<center>7</center>
<subcenter>14</subcenter>
<grid>197</grid>
<grid>184</grid>
<process>
<id>96</id>
</process>
@ -3182,10 +3181,30 @@
</model>
<model>
<name>GFSLAMPTstorm</name>
<name>MOSGuide-HI</name>
<center>7</center>
<subcenter>14</subcenter>
<grid>197</grid>
<grid>625561001</grid>
<process>
<id>96</id>
</process>
</model>
<model>
<name>GFSLAMP5km</name>
<center>7</center>
<subcenter>14</subcenter>
<grid>197</grid>
<process>
<id>108</id>
</process>
</model>
<model>
<name>GFSLAMPGrid</name>
<center>7</center>
<subcenter>14</subcenter>
<grid>184</grid>
<process>
<id>108</id>
</process>

View file

@ -19,12 +19,12 @@
further_licensing_information.
-->
<subGridDef>
<modelNames>GFSLAMPTstorm</modelNames>
<referenceGrid>197</referenceGrid>
<nx>1000</nx>
<ny>689</ny>
<modelNames>GFSLAMPGrid</modelNames>
<referenceGrid>184</referenceGrid>
<nx>700</nx>
<ny>700</ny>
<!--
<centerLatitude>46.0</centerLatitude>
<centerLongitude>-95.5</centerLongitude>
-->
</subGridDef>
</subGridDef>

View file

@ -20,11 +20,11 @@
-->
<subGridDef>
<modelNames>MOSGuide</modelNames>
<referenceGrid>197</referenceGrid>
<nx>350</nx>
<ny>350</ny>
<referenceGrid>184</referenceGrid>
<nx>700</nx>
<ny>700</ny>
<!--
<centerLatitude>46.0</centerLatitude>
<centerLongitude>-95.5</centerLongitude>
-->
</subGridDef>
</subGridDef>

View file

@ -11,7 +11,7 @@
200:200:Significant Tornado probability:%:SIGTRNDPROB
201:201:Significant Hail probability:%:SIGHAILPROB
202:202:Significant Wind probability:%:SIGWINDPROB
203:203:Categorical Thunderstorm (1-yes, 0-no):categorical:CTSTM
203:203:Categorical Lightning:categorical:CLGHT
204:204:Number of mixed layers next to surface:integer:MIXLY
205:205:Flight Category::FLGHT
206:206:Confidence - Ceiling::CICEL
@ -25,12 +25,12 @@
214:214:Near IR, White Sky Albedo:%:NWSALB
215:215:Total Probability of Severe Thunderstorms (Days 2,3):%:PRSVR
216:216:Total Probability of Extreme Severe Thunderstorms (Days 2,3):%:PRSIGSV
217:217:Mean Icing Potential:mm:MEI
218:218:Maximum Icing Potential:mm:MAIP
219:219:Mean in-Cloud Turbulence Potential:mm:MECTP
220:220:Max in-Cloud Turbulence Potential:mm:MACTP
221:221:Mean Cloud Air Turbulence Potential:mm:MECAT
222:222:Maximum Cloud Air Turbulence Potential:mm:MACAT
217:217:Supercooled Large Droplet Icing:mm:SIPD
218:218:Radiative emissivity:mm:EPSR
219:219:Turbulence Potential Forecast Index::TPFI
220:220:Categorical Servre Thunderstorm::SVRTS
221:221:Probability of Convection:%:PROCON
222:222:Categorical Convection :categorical:CONVP
223:223:Cumulonimbus Horizontal Exten:%:CBHE
224:224:Pressure at Cumulonimbus Bas:Pa:PCBB
225:225:Pressure at Cumulonimbus To:Pa:PCBT

View file

@ -13,7 +13,7 @@
212:212:Low Cloud Bottom Level::LCBL
213:213:Low Cloud Top Level::LCTL
214:214:Low Cloud Layer::LCLY
215:215:Cloud Ceiling::CEIL
215:215:Cloud Ceiling::CLG
220:220:Planetary Boundary Layer:: PLBL
221:221:Layer Between Two Hybrid Levels::NONE
222:222:Middle Cloud Bottom Level::MCBL

View file

@ -171,5 +171,6 @@
#???|256 | 0 | 0.25 | 230 | PRE | Inst Precip Rate | Radial | y | | | | Z | | | | |63 |
166|0 |0 |0.0 |230 |ML |Melting Layer |{S} {T} Melting Layer |{S} {T} ML |Graphic|y | | | |Z | | | | |67 |
170|256 |0 |0.25 |230 |DAA |One Hour Unbiased Accum |{S} Dual Pol Unbiased One Hour Accum ({U}) |{S} DAA |Radial | | | | |0.01S| | | | |69 |in/100
500|8 |0 |0.463 |463 |HSR |Reflectivity |{S} Hybrid Scan Refl ({U}) |{S} HSR |Radial | | | | | | | | | |64 |dBZ
550|8 |0 |0.926 |111 |HSR |Reflectivity |{S} Hybrid Scan Refl ({U}) |{S} HSR |Radial | | | | | | | | | |64 |dBZ
196|0 |0 |0.0 | 50 |MBA |Microburst AMDA |{S} Microburst AMDA |{S} MBA |Graphic| | | | | | | | | |28 |
500|8 |0 |0.463 |463 | Z |Reflectivity |{S} Reflectivity ({U}) |{S} Z |Radial | | | | | | | | | |64 |dBZ
550|8 |0 |0.926 |111 | Z |Reflectivity |{S} Reflectivity ({U}) |{S} Z |Radial | | | | | | | | | |64 |dBZ

View file

@ -0,0 +1,259 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<colorMap>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.0" r="0.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.0" g="0.79607844" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.52156866" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
<color a="1.0" b="0.019607844" g="0.17254902" r="1.0"/>
</colorMap>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
This_software_was_developed_and_/_or_modified_by_Raytheon_Company,
pursuant_to_Contract_DG133W-05-CQ-1067_with_the_US_Government.
U.S._EXPORT_CONTROLLED_TECHNICAL_DATA
This_software_product_contains_export-restricted_data_whose
export/transfer/disclosure_is_restricted_by_U.S._law._Dissemination
to_non-U.S._persons_whether_in_the_United_States_or_abroad_requires
an_export_license_or_other_authorization.
Contractor_Name:________Raytheon_Company
Contractor_Address:_____6825_Pine_Street,_Suite_340
________________________Mail_Stop_B8
________________________Omaha,_NE_68106
________________________402.291.0100
See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for
further_licensing_information.
-->
<DerivedParameter abbreviation="CLGTN" name="Categorical Lightning Potential" unit=""/>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
This_software_was_developed_and_/_or_modified_by_Raytheon_Company,
pursuant_to_Contract_DG133W-05-CQ-1067_with_the_US_Government.
U.S._EXPORT_CONTROLLED_TECHNICAL_DATA
This_software_product_contains_export-restricted_data_whose
export/transfer/disclosure_is_restricted_by_U.S._law._Dissemination
to_non-U.S._persons_whether_in_the_United_States_or_abroad_requires
an_export_license_or_other_authorization.
Contractor_Name:________Raytheon_Company
Contractor_Address:_____6825_Pine_Street,_Suite_340
________________________Mail_Stop_B8
________________________Omaha,_NE_68106
________________________402.291.0100
See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for
further_licensing_information.
-->
<DerivedParameter abbreviation="CLGTN" name="Categorical Lightning Potential" unit=""/>

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