package hep.aida.ref.test.pdf;
import hep.aida.IFitResult;
import hep.aida.IFitter;
import hep.aida.IFunction;
import hep.aida.IHistogram1D;
import hep.aida.IModelFunction;
import hep.aida.ref.pdf.FunctionConverter;
import hep.aida.ref.pdf.Gaussian;
import java.util.Random;
public class Chi2GaussianFit extends AbstractPdfTestCase {
private IHistogram1D h1;
public Chi2GaussianFit(String name) {
super(name);
h1 = histogramFactory().createHistogram1D("Histogram 1D",50,-10,10);
Random r = new Random();
for (int i=0; i<100000; i++)
h1.fill(r.nextGaussian());
}
public void testFit() {
Gaussian g = new Gaussian("myGauss");
IModelFunction gauss = FunctionConverter.getIModelFunction(g);
gauss.setParameter("norm",h1.maxBinHeight());
gauss.setParameter("mean",h1.mean());
gauss.setParameter("sigma",h1.rms());
IFitter gaussFit = fitFactory().createFitter("Chi2","minuit","noClone=true");
long start = System.currentTimeMillis();
IFitResult gaussFitResult = gaussFit.fit(h1,gauss);
long end = System.currentTimeMillis();
long time = end-start;
assertEquals(h1.mean(), g.getParameter("mean").value(),0.01);
assertEquals(h1.rms(), g.getParameter("sigma").value(),0.02);
assertEquals(h1.maxBinHeight(), g.getParameter("norm").value(),500);
IFunction gauss2 = functionFactory().createFunctionByName("gauss","g");
gauss2.setParameter("amplitude",h1.maxBinHeight());
gauss2.setParameter("mean",h1.mean());
gauss2.setParameter("sigma",h1.rms());
// Fit the second gaussian
long start2 = System.currentTimeMillis();
IFitResult gauss2FitResult = gaussFit.fit(h1,gauss2);
long end2 = System.currentTimeMillis();
long time2 = end2-start2;
assertEquals(gauss2FitResult.fittedFunction().parameter("amplitude"), g.getParameter("norm").value(),0.00001);
assertEquals(gauss2FitResult.fittedFunction().parameter("mean"), g.getParameter("mean").value(),0.000001);
assertEquals(gauss2FitResult.fittedFunction().parameter("sigma"), g.getParameter("sigma").value(),0.000001);
assertEquals( time, 100, 10);
}
}