package hep.aida.ref.pdf.examples;
import hep.aida.*;
import java.util.Random;
import hep.aida.ref.pdf.*;
public class SimultaneousBinnedFit
{
public static void main(String[] args)
{
// Create factories
IAnalysisFactory analysisFactory = IAnalysisFactory.create();
ITreeFactory treeFactory = analysisFactory.createTreeFactory();
ITree tree = treeFactory.create();
IPlotter plotter = analysisFactory.createPlotterFactory().create("Plotter");
IHistogramFactory histogramFactory = analysisFactory.createHistogramFactory(tree);
IFunctionFactory functionFactory = analysisFactory.createFunctionFactory(tree);
IFitFactory fitFactory = analysisFactory.createFitFactory();
IHistogram1D h1 = histogramFactory.createHistogram1D("h1",50,-10,10);
IHistogram1D h2 = histogramFactory.createHistogram1D("h2",50,-10,10);
Random r = new Random();
for (int i=0; i<100000; i++)
h1.fill(r.nextGaussian());
for (int i=0; i<100; i++)
h2.fill(3+r.nextGaussian());
Parameter mean1 = new Parameter("mean1",0,0.1);
Parameter mean2 = new Parameter("mean2",3,0.1);
Parameter sigma1 = new Parameter("sigma1",1,0.1);
Parameter sigma2 = new Parameter("sigma2",1,0.1);
Dependent x = new Dependent("x",-10, 10);
Gaussian g1 = new Gaussian("g1",x,mean1,sigma1);
Gaussian g2 = new Gaussian("g2",x,mean2,sigma2);
g1.getNormalizationParameter().setValue(h1.maxBinHeight());
g2.getNormalizationParameter().setValue(h2.maxBinHeight());
Parameter mean1Sim = new Parameter("mean1Sim",0,0.1);
Parameter mean2Sim = new Parameter("mean2Sim",3,0.1);
Parameter sigma1Sim = new Parameter("sigma1Sim",1,0.1);
Gaussian g1Sim = new Gaussian("g1Sim",x,mean1Sim,sigma1Sim);
Gaussian g2Sim = new Gaussian("g2Sim",x,mean2Sim,sigma1Sim);
g1Sim.getNormalizationParameter().setValue(h1.maxBinHeight());
g2Sim.getNormalizationParameter().setValue(h2.maxBinHeight());
plotter.createRegions(2,2);
plotter.region(0).plot(h1);
plotter.region(2).plot(h2);
plotter.region(1).plot(h1);
plotter.region(3).plot(h2);
PdfFitter fitter = new PdfFitter("Chi2","minuit");
fitter.fit(h1, g1);
fitter.fit(h2, g2);
fitter.fit( new Object[] {h1, h2}, new Function[] {g1Sim, g2Sim} );
plotter.region(0).plot(g1);
plotter.region(2).plot(g2);
plotter.region(1).plot(g1Sim);
plotter.region(3).plot(g2Sim);
plotter.show();
}
}