package jas2.hist;
import java.io.Serializable;
import java.util.Observable;
import java.util.Observer;
public abstract class Fitter extends Observable implements Observer, Runnable, Serializable
{
public abstract double getChiSquared();
public abstract double[] getParameterSigmas();
protected abstract void fit(Fittable1DFunction fa, double[] x, double[] y, double[] sigmaY) throws FitFailed;
public void fit() throws FitFailed
{
if (state != READYTOFIT) throw new FitFailed("Not ready to fit");
internalFit();
observeData();
}
public synchronized void start()
{
if (state == READYTOFIT)
{
thread = new Thread(this,"Fit thread");
thread.start();
}
}
public synchronized void stop()
{
if (thread != null) thread.stop();
}
public void run()
{
try
{
internalFit();
observeData();
}
catch (FitFailed x) {}
finally
{
synchronized (this) { thread = null; }
}
}
public synchronized void update(Observable obs, Object arg)
{
if (obs == m_data)
{
if (state == FIT) setState(READYTOFIT);
start();
}
}
public int getState()
{
return state;
}
private synchronized void observeData()
{
if (!observing && m_data instanceof Observable)
((Observable) m_data).addObserver(this);
}
private synchronized void setState(int state)
{
this.state = state;
setChanged();
notifyObservers(new FitUpdate(state));
}
private synchronized void setState(int state, FitFailed x)
{
this.state = state;
setChanged();
notifyObservers(new FitUpdate(state,x));
}
protected void setPercentComplete(int percent)
{
setChanged();
notifyObservers(new FitUpdate(state,percent));
}
private void internalFit() throws FitFailed
{
setState(FITTING);
try
{
int n = m_data.getNPoints();
double[] x = new double[n];
double[] y = new double[n];
double[] yerr = new double[n];
for (int i=0; i
Ads help maintain this website.