package hep.aida.ref.histogram;
import hep.aida.IDataPoint;
import hep.aida.IMeasurement;
import hep.aida.ref.event.AIDAListener;
import hep.aida.ref.event.AIDAObservable;
import hep.aida.ref.event.IsObservable;
/**
* Basic user-level interface class for holding and managing
* a single set of "measurements".
*
* @author The AIDA team
*
*/
public class DataPoint extends AIDAObservable implements IDataPoint, IsObservable, AIDAListener {
private int dimension;
private IMeasurement[] measurements;
// Constructors
public DataPoint(int dim) {
super();
setIsValidAfterNotify(true);
dimension = dim;
measurements = new Measurement[dim];
for (int i=0; i<dimension; i++) {
Measurement meas = new Measurement();
meas.addListener(this);
measurements[i] = meas;
}
}
public DataPoint(IDataPoint p) {
super();
setIsValidAfterNotify(true);
dimension = p.dimension();
measurements = new Measurement[dimension];
for (int i=0; i<dimension; i++) {
Measurement meas = new Measurement(p.coordinate(i));
meas.addListener(this);
measurements[i] = meas;
}
}
public DataPoint(IMeasurement[] meas) {
super();
setIsValidAfterNotify(true);
dimension = meas.length;
measurements = meas;
for (int i=0; i<meas.length; i++) {
if (measurements[i] instanceof IsObservable) ((IsObservable) measurements[i]).addListener(this);
}
}
public DataPoint(double[] val) {
super();
setIsValidAfterNotify(true);
dimension = val.length;
measurements = new Measurement[dimension];
for (int i=0; i<dimension; i++) {
Measurement meas = new Measurement(val[i]);
meas.addListener(this);
measurements[i] = meas;
}
}
public DataPoint(double[] val, double[] err) {
super();
setIsValidAfterNotify(true);
if (val.length != err.length)
throw new IllegalArgumentException("DataPoint Constructor: Value and Error arrays are not the same size");
dimension = val.length;
measurements = new Measurement[dimension];
for (int i=0; i<dimension; i++) {
Measurement meas = new Measurement(val[i], err[i]);
meas.addListener(this);
measurements[i] = meas;
}
}
public DataPoint(double[] val, double[] errMinus, double[] errPlus) {
super();
setIsValidAfterNotify(true);
if (val.length != errPlus.length)
throw new IllegalArgumentException("DataPoint Constructor: Value and Error arrays are not the same size");
if (val.length != errMinus.length)
throw new IllegalArgumentException("DataPoint Constructor: Value and Error arrays are not the same size");
dimension = val.length;
measurements = new Measurement[dimension];
for (int i=0; i<dimension; i++) {
Measurement meas = new Measurement(val[i], errMinus[i], errPlus[i]);
meas.addListener(this);
measurements[i] = meas;
}
}
// End of Constructors
public int dimension() { return dimension; }
public IMeasurement coordinate(int coord) { return measurements[coord]; }
/**
* Get the lower value for a give axis.
* This method is not in the IDataPoint interface and is here for efficiency reasons
* @param coord The coordinate of the axis.
* @return The lower edge of the corresponding axis.
* @throws IllegalArgumentException if coord < 0 or coord >= dimension() or if the set is empty.
*
*/
public double lowerExtent(int coord) throws IllegalArgumentException {
double le = measurements[coord].value();
if ( ! Double.isNaN( measurements[coord].errorMinus() ) )
le -= measurements[coord].errorMinus();
return le;
}
/**
* Get the upper value for a give axis.
* This method is not in the IDataPoint interface and is here for efficiency reasons
* @param coord The coordinate of the axis.
* @return The upper edge of the corresponding axis.
* @throws IllegalArgumentException if coord < 0 or coord >= dimension() or if the set is empty.
*
*/
public double upperExtent(int coord) throws IllegalArgumentException {
double ue = measurements[coord].value();
if ( ! Double.isNaN( measurements[coord].errorPlus() ) )
ue += measurements[coord].errorPlus();
return ue;
}
// AIDAListener methods
public void stateChanged(java.util.EventObject e) {
//System.out.println("DataPoint.stateChanged, isValid="+isValid);
fireStateChanged();
}
// Service methods
public void clear() {
if (measurements != null && measurements.length > 0) {
for (int i=0; i<measurements.length; i++) {
if (measurements[i] instanceof IsObservable) ((IsObservable) measurements[i]).removeListener(this);
}
}
}
protected void finalize() throws Throwable {
clear();
}
} // class or interface