/******************************************************************************* * Copyright (c) 2010 Oak Ridge National Laboratory. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ package org.csstudio.swt.xygraph.dataprovider; /** An (x,y) sample data with error. * <p> * The error values are absolute, positive numbers. * For example, a Sample with Y=5, negative Y error 1 and positive Y error 2 * represents a number of 5 that could also be anywhere in 4 .. 7. * The errors are not percentages. * The 'negative' error is actually a positive number. * <p> * Note: * Only the x/y value is used in equals()! * Error ranges and info texts are ignored when determining equality * with another Sample. * * @author Xihui Chen * @author Kay Kasemir Comments, made immutable */ public class Sample implements ISample { final private double xValue; final private double yValue; final private double xPlusError; final private double yPlusError; final private double xMinusError; final private double yMinusError; final private String info; /** Initialize with x/y value * @param xdata * @param ydata */ public Sample(final double xdata, final double ydata) { this(xdata, ydata, 0, 0, 0, 0, ""); //$NON-NLS-1$ } /** Initialize with value and error range * @param xValue * @param yValue * @param yPlusError * @param yMinusError * @param xPlusError * @param xMinusError */ public Sample(final double xValue, final double yValue, final double yPlusError, final double yMinusError, final double xPlusError, final double xMinusError) { this(xValue, yValue, yPlusError, yMinusError, xPlusError, xMinusError, ""); //$NON-NLS-1$ } /** Initialize with value, error ranges and info text * @param xValue * @param yValue * @param yPlusError * @param yMinusError * @param xPlusError * @param xMinusError * @param info */ public Sample(final double xValue, final double yValue, final double yPlusError, final double yMinusError, final double xPlusError, final double xMinusError, final String info) { this.xValue = xValue; this.yValue = yValue; this.xPlusError = xPlusError; this.yPlusError = yPlusError; this.xMinusError = xMinusError; this.yMinusError = yMinusError; this.info = info; } /** @return X value */ @Override public double getXValue() { return xValue; } /** @return Y value */ @Override public double getYValue() { return yValue; } /** @return Negative X error. */ @Override public double getXMinusError() { return xMinusError; } /** @return Positive X error. */ @Override public double getXPlusError() { return xPlusError; } /** @return Negative Y error. */ @Override public double getYMinusError() { return yMinusError; } /** @return Positive Y error. */ @Override public double getYPlusError() { return yPlusError; } /** @return Sample info text. */ @Override public String getInfo() { return info; } // @Override // public boolean equals(final Object obj) { // if(obj instanceof Sample) // return (((Sample)obj).xValue == xValue && ((Sample)obj).yValue == yValue); // return false; // } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((info == null) ? 0 : info.hashCode()); long temp; temp = Double.doubleToLongBits(xMinusError); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(xPlusError); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(xValue); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(yMinusError); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(yPlusError); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(yValue); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Sample other = (Sample) obj; if (info == null) { if (other.info != null) return false; } else if (!info.equals(other.info)) return false; if (Double.doubleToLongBits(xMinusError) != Double .doubleToLongBits(other.xMinusError)) return false; if (Double.doubleToLongBits(xPlusError) != Double .doubleToLongBits(other.xPlusError)) return false; if (Double.doubleToLongBits(xValue) != Double .doubleToLongBits(other.xValue)) return false; if (Double.doubleToLongBits(yMinusError) != Double .doubleToLongBits(other.yMinusError)) return false; if (Double.doubleToLongBits(yPlusError) != Double .doubleToLongBits(other.yPlusError)) return false; if (Double.doubleToLongBits(yValue) != Double .doubleToLongBits(other.yValue)) return false; return true; } /** @return String representation, mostly for debugging */ @SuppressWarnings("nls") @Override public String toString() { final StringBuilder buf = new StringBuilder(); buf.append("("); buf.append(xValue); if (xMinusError != 0 || xPlusError != 0) buf.append(" [-" + xMinusError + " ... +" + xPlusError + "]"); buf.append(", "); buf.append(yValue); if (yMinusError != 0 || yPlusError != 0) buf.append(" [-" + yMinusError + " ... +" + yPlusError + "]"); if (info != null && info.length() > 0) buf.append(", '" + info + "'"); buf.append(")"); return buf.toString(); } }