/*
* -------------------------------------------------------------------------
* $Id: Pick.java,v 1.3 2004/05/26 18:23:29 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
package com.imsl.demo.Pick;
import com.imsl.demo.gallery.Describe;
import com.imsl.math.PrintMatrix;
import com.imsl.math.PrintMatrixFormat;
import com.imsl.stat.Covariances;
import com.imsl.stat.NormTwoSample;
import com.imsl.chart.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.text.*;
import javax.swing.*;
/**
*
* @author brophy
* @created April 24, 2001
*/
public class Pick extends JFrameChart implements MouseListener {
static final java.text.DecimalFormat formatStat = new java.text.DecimalFormat("0.000");
private Selector selector;
private Selector selectorRectangle;
private Selector selectorPolygon;
private Report report;
private AxisXY axis;
private double x[], y[];
private double xSelected[], ySelected[];
private double xNotSelected[], yNotSelected[];
private Data dataNotSelected;
private Data dataSelected;
private int w;
/**
* Creates a new instance of Pick
*/
public Pick(boolean exitOnClose) {
setTitle("Select Points");
if (!exitOnClose) {
// remove the WindowListener, installed by JFrameChart, that
// exits the application when the window is closed.
Object l[] = getListeners(java.awt.event.WindowListener.class);
for (int k = 0; k < l.length; k++) {
removeWindowListener((java.awt.event.WindowListener)l[k]);
}
}
Describe des = new Describe(this, "/com/imsl/demo/Pick/Pick.html");
des.show();
Dimension ds = des.getSize();
Dimension ss = getToolkit().getScreenSize();
w = Math.min(ss.width/2, ss.height-ds.height-32);
setSize(w, w);
int xloc = Math.min(ss.width-ds.width, w-305); // leave room for report window
setLocation(xloc, ds.height);
Chart chart = getChart();
axis = new AxisXY(chart);
selectorRectangle = new Selector();
selectorPolygon = new SelectorPolygon();
initButtons();
report = new Report();
getPanel().addMouseListener(this);
int n = 200;
x = new double[n];
y = new double[n];
for (int k = 0; k < n; k++) {
x[k] = Math.random();
y[k] = Math.random();
}
axis.setDataType(Data.DATA_TYPE_MARKER);
dataSelected = new Data(axis, x, y);
dataSelected.setMarkerColor("blue");
dataSelected.setMarkerType(Data.MARKER_TYPE_FILLED_CIRCLE);
dataNotSelected = new Data(axis, x, y);
dataNotSelected.setMarkerColor("red");
dataNotSelected.setMarkerType(Data.MARKER_TYPE_HOLLOW_SQUARE);
select(null);
}
/**
* Initialize the buttons to select rectangular or polgonal sector.
*/
private void initButtons() {
ButtonGroup bg = new ButtonGroup();
JPanel panelControl = new JPanel();
((FlowLayout)panelControl.getLayout()).setAlignment(FlowLayout.LEADING);
panelControl.add(new JLabel("Selector: "));
JToggleButton buttonRectangle = new JToggleButton("Rectangle");
panelControl.add(buttonRectangle);
bg.add(buttonRectangle);
buttonRectangle.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selector = selectorRectangle;
}
});
JToggleButton buttonPolygon = new JToggleButton("Polygon");
panelControl.add(buttonPolygon);
bg.add(buttonPolygon);
buttonPolygon.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selector = selectorPolygon;
}
});
buttonRectangle.setSelected(true);
selector = selectorRectangle;
getContentPane().add(panelControl, java.awt.BorderLayout.NORTH);
}
public void mouseClicked(MouseEvent mouseEvent) {
}
public void mouseEntered(MouseEvent mouseEvent) {
}
public void mouseExited(MouseEvent mouseEvent) {
}
public void mousePressed(MouseEvent mouseEvent) {
if (mouseEvent.getButton() == 1) {
report.setVisible(false);
report.setVisible(false);
select(null);
repaint();
selector.start(mouseEvent);
getPanel().addMouseMotionListener(selector);
double user[] = {0,0};
axis.mapDeviceToUser(mouseEvent.getX(), mouseEvent.getY(), user);
}
}
public void mouseReleased(MouseEvent mouseEvent) {
if (mouseEvent.getButton() == 1) {
selector.stop(mouseEvent);
getPanel().removeMouseMotionListener(selector);
select(selector.getSelectedShape());
repaint();
new Thread(new Runnable() {
public void run() {
try {
updateReport();
} catch (Exception e) {
JOptionPane.showMessageDialog(report, e.getMessage(), "Exception", JOptionPane.ERROR_MESSAGE);
}
}
}).start();
}
}
private void select(Shape shape) {
int dev[] = {0,0};
int nSelected = 0;
for (int k = 0; k < x.length; k++) {
axis.mapUserToDevice(x[k], y[k], dev);
if (shape != null && shape.contains(dev[0], dev[1])) nSelected++;
}
xSelected = new double[nSelected];
ySelected = new double[nSelected];
xNotSelected = new double[x.length-nSelected];
yNotSelected = new double[y.length-nSelected];
int iSelected = 0;
int iNotSelected = 0;
for (int k = 0; k < x.length; k++) {
axis.mapUserToDevice(x[k], y[k], dev);
if (shape != null && shape.contains(dev[0], dev[1])) {
xSelected[iSelected] = x[k];
ySelected[iSelected++] = y[k];
} else {
xNotSelected[iNotSelected] = x[k];
yNotSelected[iNotSelected++] = y[k];
}
}
dataSelected.setX(xSelected);
dataSelected.setY(ySelected);
dataNotSelected.setX(xNotSelected);
dataNotSelected.setY(yNotSelected);
}
private void reportValue(PrintStream ps, String format, double value) {
//MessageFormat mf = new MessageFormat(""+format+" = {0}");
MessageFormat mf = new MessageFormat(format+" = <b>{0}</b>");
Object args[] = {new Double(value)};
ps.print(mf.format(args));
ps.println("<br>");
}
private void reportInterval(PrintStream ps, String format, double v0, double v1) {
MessageFormat mf = new MessageFormat(format+" = [<b>{0}</b>, <b>{1}</b>]");
Object args[] = {new Double(v0), new Double(v1)};
ps.print(mf.format(args));
ps.println("<br>");
}
private void reportHeading(PrintStream ps, String format) {
ps.println("<h3><font color='blue'>"+format+"</font></h3>");
}
void updateReport() throws Exception {
if (xSelected.length == 0) {
JOptionPane.showMessageDialog(report, "No Points Selected", "Pick", JOptionPane.WARNING_MESSAGE);
return;
}
if (xSelected.length == 1) {
JOptionPane.showMessageDialog(report, "Only One Point Selected", "Pick", JOptionPane.WARNING_MESSAGE);
return;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
/*
* Variance-Covariance matrix
*/
Covariances co = new Covariances(new double[][]{xSelected,ySelected});
reportHeading(ps, "Variance-Covariance Matrix");
PrintMatrix pm = new PrintMatrix(ps);
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(4);
PrintMatrixFormat pmf = new PrintMatrixFormat();
pmf.setNumberFormat(nf);
pm.setMatrixType(PrintMatrix.UPPER_TRIANGULAR);
double covar[][] = co.compute(Covariances.VARIANCE_COVARIANCE_MATRIX);
pm.printHTML(pmf, covar, 2, 2) ;
/*
* NormTwoSample
*/
NormTwoSample nts = new NormTwoSample(xSelected, ySelected);
double mean = nts.getDiffMean();
reportHeading(ps, "Norm Two Sample");
reportValue(ps, "mean(x1)-mean(x2)", mean);
reportValue(ps, "mean(x1)", nts.getMeanX() );
reportValue(ps, "mean(x2)", nts.getMeanY() );
double pVar = nts.getPooledVariance();
reportValue(ps, "pooled variance", pVar);
double loCI = nts.getLowerCIDiff();
double upCI = nts.getUpperCIDiff();
reportInterval(ps, "95% CI for the mean", loCI, upCI);
loCI = nts.getLowerCIDiff();
upCI = nts.getUpperCIDiff();
reportInterval(ps, "95% CI for the ueq mean", loCI, upCI);
reportHeading(ps, "T Test Results");
double tDF = nts.getTTestDF();
double tT = nts.getTTest();
double tPval = nts.getTTestP();
reportValue(ps, "T default", tDF);
reportValue(ps, "t", tT);
reportValue(ps, "p-value", tPval);
double stdevX = nts.getStdDevX();
double stdevY = nts.getStdDevY();
reportValue(ps, "stdev(x1)", stdevX);
reportValue(ps, "stdev(x2)", stdevY);
/*
* Generate a report of the points selected.
*/
reportHeading(ps, "Selected <b>"+xSelected.length+"</b> Points");
ps.println("<table border='1'>");
ps.println("<tr><td align='center'><i>k</i></td><td align='center'><i>x</i></td><td align='center'><i>y</i></td></tr>");
for (int k = 0; k < xSelected.length; k++) {
ps.println("<tr><td align='center'><i>");
ps.println(k);
ps.println("</i></td><td>");
ps.println(formatStat.format(xSelected[k]));
ps.println("</td><td>");
ps.println(formatStat.format(ySelected[k]));
ps.println("</td></tr>\r\n");
}
ps.println("</table></body></html>");
report.setText(baos.toString());
Dimension size = getSize();
Point loc = getLocationOnScreen();
report.setLocation(loc.x+size.width,loc.y);
report.show();
report.repaint();
}
static public void main(String args[]) {
boolean exitOnClose = true;
if (args.length > 0 && args[0].equals("-noexit")) exitOnClose = false;
new Pick(exitOnClose).show();
}
/**
* Select points using a rectangle.
*/
class Selector implements MouseMotionListener {
protected final Color colorFill = new Color(255,0,255,128);
protected final Color colorOutline = new Color(0,255,0);
protected int xA, yA, xB, yB;
void start(MouseEvent mouseEvent) {
xA = xB = mouseEvent.getX();
yA = yB = mouseEvent.getY();
}
void stop(MouseEvent mouseEvent) {
paint(mouseEvent, false);
}
public void mouseDragged(MouseEvent mouseEvent) {
paint(mouseEvent, true);
}
public void mouseMoved(MouseEvent mouseEvent) {
}
protected void paint(MouseEvent mouseEvent, boolean erase) {
Graphics2D g = (Graphics2D)Pick.this.getPanel().getGraphics();
if (erase) paint(g);
updateShape(mouseEvent);
paint(g);
g.dispose();
}
/**
* Draw the selected shape.
*/
protected void paint(Graphics2D g) {
Shape shape = getSelectedShape();
g.setXORMode(colorOutline);
g.draw(shape);
g.setXORMode(colorFill);
g.fill(shape);
}
protected void updateShape(MouseEvent mouseEvent) {
xB = mouseEvent.getX();
yB = mouseEvent.getY();
}
Shape getSelectedShape() {
return new Rectangle(Math.min(xA,xB), Math.min(yA,yB), Math.abs(xB-xA), Math.abs(yB-yA));
}
}
/**
* Select points using a polygon.
*/
class SelectorPolygon extends Selector {
protected Polygon polygon;
void start(MouseEvent mouseEvent) {
super.start(mouseEvent);
polygon = new Polygon();
polygon.addPoint(xA, yA);
}
protected void updateShape(MouseEvent mouseEvent) {
polygon.addPoint(mouseEvent.getX(), mouseEvent.getY());
}
Shape getSelectedShape() {
return polygon;
}
}
private class Report extends JDialog {
private JEditorPane jEditorPane;
public Report() {
super(Pick.this, false);
setTitle("Report");
jEditorPane = new javax.swing.JEditorPane();
jEditorPane.setContentType("text/html");
jEditorPane.setEditable(false);
JScrollPane scroll = new JScrollPane(jEditorPane);
getContentPane().add(scroll);
scroll.setPreferredSize(new Dimension(300, w-27));
pack();
}
void setText(String text) {
jEditorPane.setText(text);
}
}
}