/*
* AIDAFunctionAdapter.java
*
* Created on February 8, 2002, 12:01 AM
*/
package hep.aida.ref.plotter.adapter;
import hep.aida.IFunction;
import hep.aida.IManagedObject;
import hep.aida.ref.ManagedObject;
import hep.aida.ref.function.BaseModelFunction;
import hep.aida.ref.function.FunctionChangedEvent;
import hep.aida.ref.function.FunctionCoreListener;
import hep.aida.ref.function.FunctionDispatcher;
import hep.aida.ref.function.FunctionListener;
import jas.hist.DataSource;
import jas.hist.ExtendedStatistics;
import jas.hist.Fittable1DFunction;
import jas.hist.Fitter;
import jas.hist.FunctionValueUndefined;
import jas.hist.Handle;
import jas.hist.HasHandles;
import jas.hist.InvalidFunctionParameter;
/**
*
* @author Tony Johnson
* @version $Id: AIDAFunctionAdapter.java 8584 2006-08-10 23:06:37Z duns $
*/
public class AIDAFunctionAdapter extends Fittable1DFunction implements ExtendedStatistics, HasHandles, FunctionListener, FunctionCoreListener {
private IFunction function;
private double[] d = new double[1];
private boolean notify = true;
private String title = "function";
static DataSource create(IFunction function) {
if (function.dimension() == 1) return new AIDAFunctionAdapter(function);
else throw new IllegalArgumentException("Only 1-D functions supported");
}
public AIDAFunctionAdapter(IFunction function) {
this.function = function;
if ( function instanceof FunctionDispatcher ) {
( (FunctionDispatcher) function ).addFunctionListener(this);
notify = false;
}
if ( function instanceof BaseModelFunction )
( (BaseModelFunction) function ).core().addCoreListener(this);
if ( function instanceof IManagedObject )
title = ((IManagedObject)function).name();
}
public void setParameter(int index, double value) throws jas.hist.InvalidFunctionParameter {
function.setParameter(function.parameterNames()[index], value);
if ( notify )
functionChanged( new FunctionChangedEvent( FunctionChangedEvent.PARAMETER_VALUE_CHANGED ) );
}
public String[] getParameterNames() {
return function.parameterNames();
}
public double[] getParameterValues() {
return function.parameters();
}
public double valueAt(double x) throws FunctionValueUndefined {
d[0] = x;
double result = function.value(d);
if (Double.isNaN(result)) throw new FunctionValueUndefined();
return result;
}
public double valueAt(double x, double[] values) throws FunctionValueUndefined {
for ( int i = 0; i < values.length; i++ ) {
try {
setParameter(i, values[i]);
} catch ( jas.hist.InvalidFunctionParameter ifp ) {
throw new FunctionValueUndefined();
}
}
return valueAt(x);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
if ( function instanceof ManagedObject )
((ManagedObject)function).setName(title);
this.title = title;
}
public void setFit(Fitter fitter, double[] values) throws InvalidFunctionParameter {
for ( int i = 0; i < values.length; i++ ) {
try {
setParameter(i, values[i]);
} catch ( jas.hist.InvalidFunctionParameter ifp ) {
throw new InvalidFunctionParameter(getParameterNames()[i]);
}
}
setFit(fitter);
setChanged();
}
public IFunction function() {
return function;
}
public Handle[] getHandles(double xLow, double xHigh, double yLow, double yHigh) {
Handle[] handles;
if ( ! ( function instanceof BaseModelFunction ) )
handles = new Handle[0];
else {
BaseModelFunction modelFunction = (BaseModelFunction) function;
handles = modelFunction.core().getHandles(xLow, xHigh, yLow, yHigh);
}
if (handles == null)
handles = new Handle[0];
return handles;
}
public void functionChanged(FunctionChangedEvent event) {
int eventId = event.eventId();
if ( eventId == FunctionChangedEvent.PARAMETER_VALUE_CHANGED || eventId == FunctionChangedEvent.RANGE_CHANGED )
clearFit();
setChanged();
}
public void coreChanged() {
clearFit();
setChanged();
}
}