//
// PCS.java
//
package visad.paoloa;
// import needed classes
import visad.*;
import visad.java3d.DisplayImplJ3D;
import visad.java3d.TwoDDisplayRendererJ3D;
import visad.util.VisADSlider;
import visad.util.RangeSlider;
import visad.data.netcdf.Plain;
import visad.data.mcidas.BaseMapAdapter;
import java.rmi.RemoteException;
import java.io.IOException;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.Vector;
public class PCS
implements ActionListener, ScalarMapListener, DisplayListener
{
/** the width and height of the UI frame */
public static int WIDTH = 900;
public static int HEIGHT = 600;
// number of times
int ntimes;
// number of bands
int nbands;
// number of principal components
int npcs;
// number of channels
int nchannels;
// number of levels
int nlevels;
// VisAD Tuple data object created from file
Tuple file_data;
FieldImpl time_series;
FlatField eigen_vectors;
FlatField means;
FlatField pressures;
// RealTypes for data
RealType time;
RealType band;
RealType band1;
RealType band2;
RealType band3;
RealType noise_band1;
RealType noise_band2;
RealType noise_band3;
RealType latitude;
RealType longitude;
RealType levels;
RealType temperature;
RealType watervapor;
RealType numpcs;
RealType channels;
RealType princ_comp;
RealType band1_nu;
RealType band2_nu;
RealType band3_nu;
RealType band1_mean;
RealType band2_mean;
RealType band3_mean;
RealType band1_kur;
RealType band2_kur;
RealType band3_kur;
RealType pressure;
// Sets
Linear1DSet time_set;
Linear1DSet band_set;
Linear2DSet eigen_set;
Linear1DSet levels_set;
Gridded1DSet band1_set;
Gridded1DSet band2_set;
Gridded1DSet band3_set;
// DataReferenceImpls for VisADSliders
DataReferenceImpl time_ref;
DataReferenceImpl num_eigen_ref;
// DataReferenceImpls for displays
// bands versus reconstructions
DataReferenceImpl b1_ref;
DataReferenceImpl b1r_ref;
DataReferenceImpl b1d_ref;
DataReferenceImpl b2_ref;
DataReferenceImpl b2r_ref;
DataReferenceImpl b2d_ref;
DataReferenceImpl b3_ref;
DataReferenceImpl b3r_ref;
DataReferenceImpl b3d_ref;
// noise versus reconstructions
DataReferenceImpl n1_ref;
DataReferenceImpl n1r_ref;
DataReferenceImpl n2_ref;
DataReferenceImpl n2r_ref;
DataReferenceImpl n3_ref;
DataReferenceImpl n3r_ref;
// sounding lat / lons, and selected sounding
DataReferenceImpl ll_ref;
DataReferenceImpl select_ll_ref;
DataReferenceImpl map_ref;
// temperature and water vapor profiles
DataReferenceImpl temp_ref;
DataReferenceImpl wv_ref;
// MathTypes for displayed data
FunctionType b1_func;
FunctionType b2_func;
FunctionType b3_func;
FunctionType n1_func;
FunctionType n2_func;
FunctionType n3_func;
RealTupleType latlon;
FunctionType latlon_func;
FunctionType temp_profile;
FunctionType wv_profile;
// precomputed helper values for slider_cell
float[][] eigen_values;
float[][] mean_values;
Gridded1DSet pressureSet;
FlatField ll_field;
RealTuple[] ll_select;
FlatField[] tp;
FlatField[] wvp;
// display objects
DisplayImpl displayb1;
DisplayImpl displayb2;
DisplayImpl displayb3;
DisplayImpl displayll;
Vector sMaps_b1;
Vector cMaps_b1;
Vector sMaps_b2;
Vector cMaps_b2;
Vector sMaps_b3;
Vector cMaps_b3;
int toggle;
float band1_lo;
float band1_hi;
float band2_lo;
float band2_hi;
float band3_lo;
float band3_hi;
float[][] lls;
RealTupleType scatter_range_b1;
RealTupleType scatter_range_b2;
RealTupleType scatter_range_b3;
RealType scatter_index;
FunctionType scatter_type_b1;
FunctionType scatter_type_b2;
FunctionType scatter_type_b3;
final ScalarMap kur1_rgb;
final ScalarMap kur2_rgb;
final ScalarMap kur3_rgb;
DataReferenceImpl zero_b1_ref;
DataReferenceImpl zero_b2_ref;
DataReferenceImpl zero_b3_ref;
ScalarMap lonmap;
ScalarMap latmap;
// type 'java visad.paoloa.PCS file.nc' to run this application
public static void main(String args[])
throws VisADException, RemoteException, IOException {
if (args.length < 1) {
/* CTR: 29 September 1998 */
System.out.println("To run this program, type " +
"\"java visad.paoloa.PCS file.nc\"");
System.out.println("where file.nc is a netCDF file containing " +
"GIFTS spectra and eigenvector");
return;
}
PCS pcs = new PCS(args[0]);
}
public PCS(String filename)
throws VisADException, RemoteException, IOException {
// create a netCDF reader
Plain plain = new Plain();
// open a netCDF file containing a NAST-I file
file_data = (Tuple) plain.open(filename);
plain = null;
//-System.out.println(file_data.getType());
// extract the time sequence of spectra
time_series = (FieldImpl) file_data.getComponent(0);
eigen_vectors = (FlatField) file_data.getComponent(1);
means = (FlatField) file_data.getComponent(2);
pressures = (FlatField) file_data.getComponent(3);
// extract RealTypes and use them to determine how data are displayed
FunctionType time_type = (FunctionType) time_series.getType();
FunctionType eigen_type = (FunctionType) eigen_vectors.getType();
FunctionType means_type = (FunctionType) means.getType();
FunctionType pres_type = (FunctionType) pressures.getType();
time = (RealType)
((RealTupleType) time_type.getDomain()).getComponent(0);
TupleType time_range = (TupleType) time_type.getRange();
FunctionType tr0 = (FunctionType) time_range.getComponent(0);
FunctionType tr1 = (FunctionType) time_range.getComponent(1);
FunctionType tr2 = (FunctionType) time_range.getComponent(2);
band = (RealType)
((RealTupleType) tr0.getDomain()).getComponent(0);
RealTupleType bands = (RealTupleType) tr0.getRange();
band1 = (RealType) bands.getComponent(0);
band2 = (RealType) bands.getComponent(1);
band3 = (RealType) bands.getComponent(2);
noise_band1 = (RealType) bands.getComponent(3);
noise_band2 = (RealType) bands.getComponent(4);
noise_band3 = (RealType) bands.getComponent(5);
latlon = (RealTupleType) tr1.getRange();
latitude = (RealType) latlon.getComponent(0);
longitude = (RealType) latlon.getComponent(1);
levels = (RealType)
((RealTupleType) tr2.getDomain()).getComponent(0);
RealTupleType tuplewv = (RealTupleType) tr2.getRange();
temperature = (RealType) tuplewv.getComponent(0);
watervapor = (RealType) tuplewv.getComponent(1);
RealTupleType ed = (RealTupleType) eigen_type.getDomain();
numpcs = (RealType) ed.getComponent(0);
channels = (RealType) ed.getComponent(1);
princ_comp = (RealType) eigen_type.getRange();
RealTupleType mr = (RealTupleType) means_type.getRange();
band1_nu = (RealType) mr.getComponent(0);
band2_nu = (RealType) mr.getComponent(1);
band3_nu = (RealType) mr.getComponent(2);
band1_mean = (RealType) mr.getComponent(3);
band2_mean = (RealType) mr.getComponent(4);
band3_mean = (RealType) mr.getComponent(5);
band1_kur = (RealType) mr.getComponent(6);
band2_kur = (RealType) mr.getComponent(7);
band3_kur = (RealType) mr.getComponent(8);
pressure = (RealType) pres_type.getRange();
scatter_range_b1 = new RealTupleType(band,band1,band1_kur);
scatter_range_b2 = new RealTupleType(band,band2,band2_kur);
scatter_range_b3 = new RealTupleType(band,band3,band3_kur);
scatter_index = RealType.getRealType("scatter_index");
scatter_type_b1 = new FunctionType(scatter_index, scatter_range_b1);
scatter_type_b2 = new FunctionType(scatter_index, scatter_range_b2);
scatter_type_b3 = new FunctionType(scatter_index, scatter_range_b3);
// construct MathTypes for display data
b1_func = new FunctionType(band, band1);
b2_func = new FunctionType(band, band2);
b3_func = new FunctionType(band, band3);
n1_func = new FunctionType(band, noise_band1);
n2_func = new FunctionType(band, noise_band2);
n3_func = new FunctionType(band, noise_band3);
latlon_func = new FunctionType(time, latlon);
temp_profile = new FunctionType(pressure, temperature);
wv_profile = new FunctionType(pressure, watervapor);
// get Sets
Tuple tt = (Tuple) time_series.getSample(0);
time_set = (Linear1DSet) time_series.getDomainSet();
band_set = (Linear1DSet) ((Field) tt.getComponent(0)).getDomainSet();
eigen_set = (Linear2DSet) eigen_vectors.getDomainSet();
levels_set = (Linear1DSet) ((Field) tt.getComponent(2)).getDomainSet();
// get numbers of various things
ntimes = time_set.getLength();
nbands = band_set.getLength();
int[] lens = eigen_set.getLengths();
npcs = lens[0];
nchannels = lens[1];
if (nchannels != 3 * nbands) {
throw new VisADException("nchannels " + nchannels + " != 3 * " +
nbands + " nbands");
}
nlevels = levels_set.getLength();
//- make zero line for diff/kurtosis display -------------
//
float[][] f_array = new float[1][nbands];
for ( int ii = 0; ii < nbands; ii++) {
f_array[0][ii] = (float) 0.0;
}
FlatField zero_b1 = new FlatField(b1_func, band_set);
FlatField zero_b2 = new FlatField(b2_func, band_set);
FlatField zero_b3 = new FlatField(b3_func, band_set);
zero_b1.setSamples(f_array, false);
zero_b2.setSamples(f_array, false);
zero_b3.setSamples(f_array, false);
//- make wavelength domain set for each band -------------
//
double[][] d_array = means.getValues();
double[][] nu_vals = new double[1][nbands];
nu_vals[0] = d_array[0];
band1_set = new Gridded1DSet(band, Set.doubleToFloat(nu_vals), nbands);
band1_lo = band1_set.getLowX();
band1_hi = band1_set.getHiX();
nu_vals[0] = d_array[1];
band2_set = new Gridded1DSet(band, Set.doubleToFloat(nu_vals), nbands);
band2_lo = band2_set.getLowX();
band2_hi = band2_set.getHiX();
nu_vals[0] = d_array[2];
band3_set = new Gridded1DSet(band, Set.doubleToFloat(nu_vals), nbands);
band3_lo = band3_set.getLowX();
band3_hi = band3_set.getHiX();
// System.out.println(ntimes + " " + nbands + " " + npcs + " " + nlevels);
b1_ref = new DataReferenceImpl("b1_ref");
b1r_ref = new DataReferenceImpl("b1r_ref");
b1d_ref = new DataReferenceImpl("b1d_ref");
b2_ref = new DataReferenceImpl("b2_ref");
b2r_ref = new DataReferenceImpl("b2r_ref");
b2d_ref = new DataReferenceImpl("b2d_ref");
b3_ref = new DataReferenceImpl("b3_ref");
b3r_ref = new DataReferenceImpl("b3r_ref");
b3d_ref = new DataReferenceImpl("b3d_ref");
n1_ref = new DataReferenceImpl("n1_ref");
n1r_ref = new DataReferenceImpl("n1r_ref");
n2_ref = new DataReferenceImpl("n2_ref");
n2r_ref = new DataReferenceImpl("n2r_ref");
n3_ref = new DataReferenceImpl("n3_ref");
n3r_ref = new DataReferenceImpl("n3r_ref");
ll_ref = new DataReferenceImpl("ll_ref");
select_ll_ref = new DataReferenceImpl("select_ll_ref");
map_ref = new DataReferenceImpl("map_ref");
wv_ref = new DataReferenceImpl("wv_ref");
temp_ref = new DataReferenceImpl("temp_ref");
time_ref = new DataReferenceImpl("time_ref");
num_eigen_ref = new DataReferenceImpl("num_eigen_ref");
zero_b1_ref = new DataReferenceImpl("zero_b1_ref");
zero_b2_ref = new DataReferenceImpl("zero_b2_ref");
zero_b3_ref = new DataReferenceImpl("zero_b3_ref");
zero_b1_ref.setData(zero_b1);
zero_b2_ref.setData(zero_b2);
zero_b3_ref.setData(zero_b3);
toggle = 0;
//-- make band_1 display ---------------------------
//
sMaps_b1 = new Vector();
cMaps_b1 = new Vector();
kur1_rgb = new ScalarMap(band1_kur, Display.RGB);
displayb1 =
new DisplayImplJ3D("displayb1", new TwoDDisplayRendererJ3D());
final ScalarMap bmapb1 = new ScalarMap(band, Display.XAxis);
bmapb1.addScalarMapListener(this);
sMaps_b1.addElement(bmapb1);
displayb1.addMap(bmapb1);
final ScalarMap smap = new ScalarMap(band1, Display.YAxis);
sMaps_b1.addElement(smap);
displayb1.addMap(smap);
GraphicsModeControl modeb1 = displayb1.getGraphicsModeControl();
modeb1.setScaleEnable(true);
ConstantMap[] yellow =
new ConstantMap[] {new ConstantMap(0.0, Display.Blue)};
ConstantMap[] cyan =
new ConstantMap[] {new ConstantMap(0.0, Display.Red)};
cMaps_b1.addElement(yellow);
cMaps_b1.addElement(cyan);
displayb1.setAlwaysAutoScale(true);
displayb1.addReference(b1_ref, yellow);
displayb1.addReference(b1r_ref, cyan);
//-- make band_2 display ---------------------------
//
sMaps_b2 = new Vector();
cMaps_b2 = new Vector();
kur2_rgb = new ScalarMap(band2_kur, Display.RGB);
displayb2 =
new DisplayImplJ3D("displayb2", new TwoDDisplayRendererJ3D());
final ScalarMap bmapb2 = new ScalarMap(band, Display.XAxis);
sMaps_b2.addElement(bmapb2);
displayb2.addMap(bmapb2);
final ScalarMap smap2 = new ScalarMap(band2, Display.YAxis);
sMaps_b2.addElement(smap2);
displayb2.addMap(smap2);
GraphicsModeControl modeb2 = displayb2.getGraphicsModeControl();
modeb2.setScaleEnable(true);
yellow = new ConstantMap[] {new ConstantMap(0.0, Display.Blue)};
cyan = new ConstantMap[] {new ConstantMap(0.0, Display.Red)};
cMaps_b2.addElement(yellow);
cMaps_b2.addElement(cyan);
displayb2.setAlwaysAutoScale(true);
displayb2.addReference(b2_ref, yellow);
displayb2.addReference(b2r_ref, cyan);
//-- make band_3 display ---------------------------
//
sMaps_b3 = new Vector();
cMaps_b3 = new Vector();
kur3_rgb = new ScalarMap(band3_kur, Display.RGB);
displayb3 =
new DisplayImplJ3D("displayb3", new TwoDDisplayRendererJ3D());
final ScalarMap bmapb3 = new ScalarMap(band, Display.XAxis);
sMaps_b3.addElement(bmapb3);
displayb3.addMap(bmapb3);
ScalarMap smap3 = new ScalarMap(band3, Display.YAxis);
sMaps_b3.addElement(smap3);
displayb3.addMap(smap3);
GraphicsModeControl modeb3 = displayb3.getGraphicsModeControl();
modeb3.setScaleEnable(true);
yellow = new ConstantMap[] {new ConstantMap(0.0, Display.Blue)};
cyan = new ConstantMap[] {new ConstantMap(0.0, Display.Red)};
cMaps_b3.addElement(yellow);
cMaps_b3.addElement(cyan);
displayb3.setAlwaysAutoScale(true);
displayb3.addReference(b3_ref, yellow);
displayb3.addReference(b3r_ref, cyan);
//-- make band_1 noise display -----------------------
//
DisplayImpl displayn1 =
new DisplayImplJ3D("displayn1", new TwoDDisplayRendererJ3D());
final ScalarMap bmapn1 = new ScalarMap(band, Display.XAxis);
displayn1.addMap(bmapn1);
displayn1.addMap(new ScalarMap(noise_band1, Display.YAxis));
GraphicsModeControl moden1 = displayn1.getGraphicsModeControl();
moden1.setScaleEnable(true);
yellow = new ConstantMap[] {new ConstantMap(0.0, Display.Blue)};
cyan = new ConstantMap[] {new ConstantMap(0.0, Display.Red)};
displayn1.addReference(n1_ref, yellow);
displayn1.addReference(n1r_ref, cyan);
//-- make band_2 noise display -----------------------
//
DisplayImpl displayn2 =
new DisplayImplJ3D("displayn2", new TwoDDisplayRendererJ3D());
final ScalarMap bmapn2 = new ScalarMap(band, Display.XAxis);
displayn2.addMap(bmapn2);
displayn2.addMap(new ScalarMap(noise_band2, Display.YAxis));
GraphicsModeControl moden2 = displayn2.getGraphicsModeControl();
moden2.setScaleEnable(true);
yellow = new ConstantMap[] {new ConstantMap(0.0, Display.Blue)};
cyan = new ConstantMap[] {new ConstantMap(0.0, Display.Red)};
displayn2.addReference(n2_ref, yellow);
displayn2.addReference(n2r_ref, cyan);
//-- make band_3 noise display -----------------------
//
DisplayImpl displayn3 =
new DisplayImplJ3D("displayn3", new TwoDDisplayRendererJ3D());
final ScalarMap bmapn3 = new ScalarMap(band, Display.XAxis);
displayn3.addMap(bmapn3);
displayn3.addMap(new ScalarMap(noise_band3, Display.YAxis));
GraphicsModeControl moden3 = displayn3.getGraphicsModeControl();
moden3.setScaleEnable(true);
yellow = new ConstantMap[] {new ConstantMap(0.0, Display.Blue)};
cyan = new ConstantMap[] {new ConstantMap(0.0, Display.Red)};
displayn3.addReference(n3_ref, yellow);
displayn3.addReference(n3r_ref, cyan);
//-- make map display --------------------------------
//
displayll =
new DisplayImplJ3D("displayll", new TwoDDisplayRendererJ3D());
displayll.addDisplayListener(this);
// new DisplayImplJ3D("displayll");
lonmap = new ScalarMap(longitude, Display.XAxis);
// ScalarMap lonmap = new ScalarMap(longitude, Display.Longitude);
displayll.addMap(lonmap);
latmap = new ScalarMap(latitude, Display.YAxis);
// ScalarMap latmap = new ScalarMap(latitude, Display.Latitude);
displayll.addMap(latmap);
GraphicsModeControl modell = displayll.getGraphicsModeControl();
modell.setScaleEnable(true);
yellow = new ConstantMap[] {new ConstantMap(0.0, Display.Blue),
new ConstantMap(5.0, Display.PointSize)};
cyan = new ConstantMap[] {new ConstantMap(0.0, Display.Red),
new ConstantMap(0.5, Display.Green),
new ConstantMap(0.5, Display.Blue),
new ConstantMap(5.0, Display.PointSize)};
displayll.addReference(select_ll_ref, yellow);
displayll.addReference(ll_ref, cyan);
displayll.addReference(map_ref);
//-- make atmos profile display -------------------------
//
DisplayImpl displayprof =
new DisplayImplJ3D("displayprof", new TwoDDisplayRendererJ3D());
displayprof.addMap(new ScalarMap(temperature, Display.XAxis));
displayprof.addMap(new ScalarMap(watervapor, Display.XAxis));
ScalarMap pmap = new ScalarMap(pressure, Display.YAxis);
pmap.setRange(1050.0, 0.0);
displayprof.addMap(pmap);
GraphicsModeControl modeprof = displayprof.getGraphicsModeControl();
modeprof.setScaleEnable(true);
ConstantMap[] red = {new ConstantMap(0.0, Display.Blue),
new ConstantMap(0.0, Display.Green)};
ConstantMap[] green = {new ConstantMap(0.0, Display.Blue),
new ConstantMap(0.0, Display.Red)};
displayprof.addReference(wv_ref, green);
displayprof.addReference(temp_ref, red);
// create a JFrame
JFrame frame = new JFrame("Principal Components");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
};
frame.addWindowListener(l);
frame.setSize(WIDTH, HEIGHT);
frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(screenSize.width/2 - WIDTH/2,
screenSize.height/2 - HEIGHT/2);
// create big_panel JPanel in frame
JPanel big_panel = new JPanel();
big_panel.setLayout(new BoxLayout(big_panel, BoxLayout.Y_AXIS));
big_panel.setAlignmentY(JPanel.TOP_ALIGNMENT);
big_panel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
frame.getContentPane().add(big_panel);
// create sliders JPanel
JPanel sliders = new JPanel();
sliders.setName("PCS Sliders");
sliders.setFont(new Font("Dialog", Font.PLAIN, 12));
sliders.setLayout(new BoxLayout(sliders, BoxLayout.X_AXIS));
sliders.setAlignmentY(JPanel.TOP_ALIGNMENT);
sliders.setAlignmentX(JPanel.LEFT_ALIGNMENT);
big_panel.add(sliders);
// construct VisADSliders linked to Real Data objects and embedded
// in sliders JPanel
/*
sliders.add(new VisADSlider("time", 1, ntimes, 1, 1.0, time_ref,
time));
*/
time_ref.setData(new Real(time, 1));
// sliders.add(new JLabel(" "));
sliders.add(new VisADSlider("neigen", 0, npcs, 0, 1.0,
num_eigen_ref, numpcs));
JButton button = new JButton("kurtosis");
button.addActionListener(this);
button.setActionCommand("kurtosis");
sliders.add(button);
RangeSlider rs = new RangeSlider("band range", 0.0f, (float) nbands) {
public void valuesUpdated() {
float b_lo;
float b_hi;
float scale1 = (band1_hi - band1_lo)/nbands;
float scale2 = (band2_hi - band2_lo)/nbands;
float scale3 = (band3_hi - band3_lo)/nbands;
float[] minmax = getMinMaxValues();
float min = minmax[0];
float max = minmax[1];
try {
b_lo = band1_lo + scale1*min;
b_hi = band1_hi - scale1*(nbands-max);
bmapb1.setRange(b_lo, b_hi);
bmapn1.setRange(b_lo, b_hi);
b_lo = band2_lo + scale2*min;
b_hi = band2_hi - scale2*(nbands-max);
bmapb2.setRange(b_lo, b_hi);
bmapn2.setRange(b_lo, b_hi);
b_lo = band3_lo + scale3*min;
b_hi = band3_hi - scale3*(nbands-max);
bmapb3.setRange(b_lo, b_hi);
bmapn3.setRange(b_lo, b_hi);
}
catch (VisADException exc) { }
catch (RemoteException exc ) { }
}
};
sliders.add(rs);
// create top display JPanel
JPanel top = new JPanel();
top.setName("PCS Sliders");
top.setFont(new Font("Dialog", Font.PLAIN, 12));
top.setLayout(new BoxLayout(top, BoxLayout.X_AXIS));
top.setAlignmentY(JPanel.TOP_ALIGNMENT);
top.setAlignmentX(JPanel.LEFT_ALIGNMENT);
big_panel.add(top);
// get Display panels
JPanel panel1 = (JPanel) displayb1.getComponent();
JPanel panel2 = (JPanel) displayb2.getComponent();
JPanel panel3 = (JPanel) displayb3.getComponent();
JPanel panel4 = (JPanel) displayll.getComponent();
// make borders for Displays and embed in display_panel JPanel
Border etchedBorder5 =
new CompoundBorder(new EtchedBorder(),
new EmptyBorder(5, 5, 5, 5));
panel1.setBorder(etchedBorder5);
panel2.setBorder(etchedBorder5);
panel3.setBorder(etchedBorder5);
panel4.setBorder(etchedBorder5);
top.add(panel1);
top.add(panel2);
top.add(panel3);
top.add(panel4);
// create bottom display JPanel
JPanel bottom = new JPanel();
bottom.setName("PCS Sliders");
bottom.setFont(new Font("Dialog", Font.PLAIN, 12));
bottom.setLayout(new BoxLayout(bottom, BoxLayout.X_AXIS));
bottom.setAlignmentY(JPanel.TOP_ALIGNMENT);
bottom.setAlignmentX(JPanel.LEFT_ALIGNMENT);
big_panel.add(bottom);
JPanel panel5 = (JPanel) displayn1.getComponent();
JPanel panel6 = (JPanel) displayn2.getComponent();
JPanel panel7 = (JPanel) displayn3.getComponent();
JPanel panel8 = (JPanel) displayprof.getComponent();
// make borders for Displays and embed in display_panel JPanel
panel5.setBorder(etchedBorder5);
panel6.setBorder(etchedBorder5);
panel7.setBorder(etchedBorder5);
panel8.setBorder(etchedBorder5);
bottom.add(panel5);
bottom.add(panel6);
bottom.add(panel7);
bottom.add(panel8);
// precompute some values
// compute mean_values
float[][] values = means.getFloats(false);
mean_values = new float[3][nbands];
mean_values[0] = values[3];
mean_values[1] = values[4];
mean_values[2] = values[5];
// compute eigen_values
values = eigen_vectors.getFloats(false);
eigen_values = new float[npcs][nchannels];
for (int j=0; j<npcs; j++) {
double mag = 0.0;
double m = 0;
for (int i=0; i<nchannels; i++) {
eigen_values[j][i] = values[0][j + npcs * i];
m += npcs;
mag += eigen_values[j][i] * eigen_values[j][i];
}
float invmag = (float) (1.0 / Math.sqrt(mag));
for (int i=0; i<nchannels; i++) {
eigen_values[j][i] *= invmag;
}
// System.out.println("mag eigen[" + j + "] = " + mag);
}
// compute pressureSet
values = pressures.getFloats(false);
Gridded1DSet pressureSet = new Gridded1DSet(pressure, values, nlevels);
// compute ll_field and ll_select
float latmin = Float.MAX_VALUE;
float latmax = -Float.MAX_VALUE;
float lonmin = Float.MAX_VALUE;
float lonmax = -Float.MAX_VALUE;
float del_lat = 1.0f;
float del_lon = 1.0f;
lls = new float[2][ntimes];
ll_select = new RealTuple[ntimes];
for (int i=0; i<ntimes; i++) {
Tuple tup = (Tuple) time_series.getSample(i);
FlatField ll = (FlatField) tup.getComponent(1);
values = ll.getFloats(false);
lls[0][i] = values[0][0];
lls[1][i] = values[1][0];
if (lls[0][i] < latmin) latmin = lls[0][i];
if (lls[0][i] > latmax) latmax = lls[0][i];
if (lls[1][i] < lonmin) lonmin = lls[1][i];
if (lls[1][i] > lonmax) lonmax = lls[1][i];
double[] vals = {values[0][0], values[1][0]};
ll_select[i] = new RealTuple(latlon, vals);
}
ll_field = new FlatField(latlon_func, new Integer1DSet(time, ntimes));
ll_field.setSamples(lls);
ll_ref.setData(ll_field);
// adjust map boundaries
lonmap.setRange(lonmax, lonmin);
latmap.setRange(latmin, latmax);
// get map
BaseMapAdapter baseMap = new BaseMapAdapter("OUTLSUPW");
if ( baseMap.isEastPositive() ) {
baseMap.setEastPositive(false);
}
baseMap.setLatLonLimits(latmin-del_lat, latmax+del_lat,
lonmin-del_lon, lonmax+del_lon);
DataImpl map = baseMap.getData();
map_ref.setData(map);
// compute tp and wvp
tp = new FlatField[ntimes];
wvp = new FlatField[ntimes];
for (int i=0; i<ntimes; i++) {
Tuple tup = (Tuple) time_series.getSample(i);
FlatField twv = (FlatField) tup.getComponent(2);
values = twv.getFloats(false);
float[][] t_values = {values[0]};
tp[i] = new FlatField(temp_profile, pressureSet);
tp[i].setSamples(t_values, false);
float[][] wv_values = {values[1]};
wvp[i] = new FlatField(wv_profile, pressureSet);
wvp[i].setSamples(wv_values, false);
}
// CellImpl to change displays when user moves sliders
CellImpl slider_cell = new CellImpl() {
public void doAction() throws VisADException, RemoteException {
int t = (int) ((Real) time_ref.getData()).getValue() - 1;
int ne = (int) ((Real) num_eigen_ref.getData()).getValue();
if (t < 0 || ntimes <= t || ne < 0 || npcs < ne) {
System.out.println("time " + t + " or neigens " +
ne + " out of bounds");
return;
}
Tuple tup = (Tuple) time_series.getSample(t);
FlatField bn = (FlatField) tup.getComponent(0);
float[][] cvalues = bn.getFloats(false);
float[] b = new float[nchannels];
float[] n = new float[nchannels];
float[] bm = new float[nchannels];
for (int k=0; k<3; k++) {
int kb = k * nbands;
for (int i=0; i<nbands; i++) {
b[kb + i] = cvalues[k][i];
n[kb + i] = cvalues[3 + k][i];
bm[kb + i] = mean_values[k][i];
}
}
float[] bcoefs = new float[ne];
float[] ncoefs = new float[ne];
for (int j=0; j<ne; j++) {
double bcoef = 0.0;
double ncoef = 0.0;
float[] pc = eigen_values[j];
for (int i=0; i<nchannels; i++) {
bcoef += pc[i] * (b[i] - bm[i]);
ncoef += pc[i] * n[i];
}
bcoefs[j] = (float) bcoef;
ncoefs[j] = (float) ncoef;
}
float[] rb = new float[nchannels];
float[] rn = new float[nchannels];
for (int i=0; i<nchannels; i++) {
float bv = bm[i];
float nv = 0.0f;
for (int j=0; j<ne; j++) {
bv += bcoefs[j] * eigen_values[j][i];
nv += ncoefs[j] * eigen_values[j][i];
}
rb[i] = bv;
rn[i] = nv;
}
float[][] rvalues = new float[6][nbands];
for (int k=0; k<3; k++) {
int kb = k * nbands;
for (int i=0; i<nbands; i++) {
rvalues[k][i] = rb[kb + i];
rvalues[3 + k][i] = rn[kb + i];
}
}
//- retrieve statistics fields
//
FlatField stat_field = (FlatField)file_data.getComponent(2);
double[][] stats = stat_field.getValues();
float[][] vals = {cvalues[0]};
FlatField b1 = new FlatField(b1_func, band1_set);
b1.setSamples(vals, false);
b1_ref.setData(b1);
vals = new float[][] {rvalues[0]};
FlatField b1r = new FlatField(b1_func, band1_set);
b1r.setSamples(vals, false);
b1r_ref.setData(b1r);
//- compute (band1 - band1_reconstructed) scatter plots
//
double[][] diff_vals = ((FlatField)b1.subtract(b1r)).getValues();
float[][] new_vals = new float[3][];
Set set = b1.getDomainSet();
float[][] samps = set.getSamples();
new_vals[0] = samps[0];
new_vals[1] = (Set.doubleToFloat(diff_vals))[0];
new_vals[2] = (Set.doubleToFloat(stats))[6];
Integer1DSet iset = new Integer1DSet(scatter_index, nbands);
FlatField scatter_field = new FlatField(scatter_type_b1, iset);
scatter_field.setSamples(new_vals, false);
b1d_ref.setData(scatter_field);
vals = new float[][] {cvalues[1]};
FlatField b2 = new FlatField(b2_func, band2_set);
b2.setSamples(vals, false);
b2_ref.setData(b2);
vals = new float[][] {rvalues[1]};
FlatField b2r = new FlatField(b2_func, band2_set);
b2r.setSamples(vals, false);
b2r_ref.setData(b2r);
//- compute (band2 - band2_reconstructed) scatter plots
//
diff_vals = ((FlatField)b2.subtract(b2r)).getValues();
new_vals = new float[3][];
set = b2.getDomainSet();
samps = set.getSamples();
new_vals[0] = samps[0];
new_vals[1] = (Set.doubleToFloat(diff_vals))[0];
new_vals[2] = (Set.doubleToFloat(stats))[7];
iset = new Integer1DSet(scatter_index, nbands);
scatter_field = new FlatField(scatter_type_b2, iset);
scatter_field.setSamples(new_vals, false);
b2d_ref.setData(scatter_field);
vals = new float[][] {cvalues[2]};
FlatField b3 = new FlatField(b3_func, band3_set);
b3.setSamples(vals, false);
b3_ref.setData(b3);
vals = new float[][] {rvalues[2]};
FlatField b3r = new FlatField(b3_func, band3_set);
b3r.setSamples(vals, false);
b3r_ref.setData(b3r);
//- compute (band3 - band1_reconstructed) scatter plots
//
diff_vals = ((FlatField)b3.subtract(b3r)).getValues();
new_vals = new float[3][];
set = b3.getDomainSet();
samps = set.getSamples();
new_vals[0] = samps[0];
new_vals[1] = (Set.doubleToFloat(diff_vals))[0];
new_vals[2] = (Set.doubleToFloat(stats))[8];
iset = new Integer1DSet(scatter_index, nbands);
scatter_field = new FlatField(scatter_type_b3, iset);
scatter_field.setSamples(new_vals, false);
b3d_ref.setData(scatter_field);
//-- noise band1 ----------------------------------
//
vals = new float[][] {cvalues[3]};
FlatField n1 = new FlatField(n1_func, band1_set);
n1.setSamples(vals, false);
n1_ref.setData(n1);
vals = new float[][] {rvalues[3]};
FlatField n1r = new FlatField(n1_func, band1_set);
n1r.setSamples(vals, false);
n1r_ref.setData(n1r);
//-- noise band2 -----------------------------------
//
vals = new float[][] {cvalues[4]};
FlatField n2 = new FlatField(n2_func, band2_set);
n2.setSamples(vals, false);
n2_ref.setData(n2);
vals = new float[][] {rvalues[4]};
FlatField n2r = new FlatField(n2_func, band2_set);
n2r.setSamples(vals, false);
n2r_ref.setData(n2r);
//- noise band3 ------------------------------------
//
vals = new float[][] {cvalues[5]};
FlatField n3 = new FlatField(n3_func, band3_set);
n3.setSamples(vals, false);
n3_ref.setData(n3);
vals = new float[][] {rvalues[5]};
FlatField n3r = new FlatField(n3_func, band3_set);
n3r.setSamples(vals, false);
n3r_ref.setData(n3r);
select_ll_ref.setData(ll_select[t]);
temp_ref.setData(tp[t]);
wv_ref.setData(wvp[t]);
}
};
// link sliders to slider_cell
slider_cell.addReference(time_ref);
slider_cell.addReference(num_eigen_ref);
// make the JFrame visible
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
String cmd = e.getActionCommand();
if ( cmd.equals("kurtosis") ) {
if ( toggle == 0 ) {
try {
displayb1.removeAllReferences();
displayb1.clearMaps();
displayb1.addMap((ScalarMap)sMaps_b1.elementAt(0));
displayb1.addMap((ScalarMap)sMaps_b1.elementAt(1));
displayb1.addMap(kur1_rgb);
displayb1.addReference(b1d_ref);
displayb2.removeAllReferences();
displayb2.clearMaps();
displayb2.addMap((ScalarMap)sMaps_b2.elementAt(0));
displayb2.addMap((ScalarMap)sMaps_b2.elementAt(1));
displayb2.addMap(kur2_rgb);
displayb2.addReference(b2d_ref);
displayb3.removeAllReferences();
displayb3.clearMaps();
displayb3.addMap((ScalarMap)sMaps_b3.elementAt(0));
displayb3.addMap((ScalarMap)sMaps_b3.elementAt(1));
displayb3.addMap(kur3_rgb);
displayb3.addReference(b3d_ref);
}
catch (VisADException exc) {
System.out.println(exc.getMessage());
}
catch (RemoteException exc) {
System.out.println(exc.getMessage());
}
toggle = 1;
}
else {
try {
displayb1.removeAllReferences();
displayb1.clearMaps();
displayb1.addMap((ScalarMap)sMaps_b1.elementAt(0));
displayb1.addMap((ScalarMap)sMaps_b1.elementAt(1));
displayb1.addReference(b1_ref, (ConstantMap[])cMaps_b1.elementAt(0));
displayb1.addReference(b1r_ref, (ConstantMap[])cMaps_b1.elementAt(1));
displayb2.removeAllReferences();
displayb2.clearMaps();
displayb2.addMap((ScalarMap)sMaps_b2.elementAt(0));
displayb2.addMap((ScalarMap)sMaps_b2.elementAt(1));
displayb2.addReference(b2_ref, (ConstantMap[])cMaps_b2.elementAt(0));
displayb2.addReference(b2r_ref, (ConstantMap[])cMaps_b2.elementAt(1));
displayb3.removeAllReferences();
displayb3.clearMaps();
displayb3.addMap((ScalarMap)sMaps_b3.elementAt(0));
displayb3.addMap((ScalarMap)sMaps_b3.elementAt(1));
displayb3.addReference(b3_ref, (ConstantMap[])cMaps_b3.elementAt(0));
displayb3.addReference(b3r_ref, (ConstantMap[])cMaps_b3.elementAt(1));
}
catch (VisADException exc) {
System.out.println(exc.getMessage());
}
catch (RemoteException exc) {
System.out.println(exc.getMessage());
}
toggle = 0;
}
}
}
public void mapChanged(ScalarMapEvent evt)
throws VisADException, RemoteException
{
ScalarMap smap = evt.getScalarMap();
}
public void controlChanged(ScalarMapControlEvent evt)
{
}
public void displayChanged(DisplayEvent evt)
throws VisADException, RemoteException
{
if (evt.getId() == DisplayEvent.MOUSE_PRESSED_CENTER)
{
double lon, lat;
double[] scale_offset = new double[2];
double[] data = new double[2];
double[] display = new double[2];
double[] cur = null;
int tt;
double del_lon = 3.0; //- need to determine these more precisely
double del_lat = 3.0; //- from scale info below
cur = displayll.getDisplayRenderer().getCursor();
lonmap.getScale(scale_offset, data, display);
lon = (cur[0] - scale_offset[1])/scale_offset[0];
latmap.getScale(scale_offset, data, display);
lat = (cur[1] - scale_offset[1])/scale_offset[0];
for ( tt = 0; tt < ntimes; tt++ ) //- linear search OK for small # of pts.
{
if ( ((lls[1][tt] < lon+del_lon) && (lls[1][tt] > lon-del_lon)) &&
((lls[0][tt] < lat+del_lat) && (lls[0][tt] > lat-del_lat)) )
{
time_ref.setData(new Real(time, tt+1));
break;
}
}
}
}
}