package hep.aida.ref.pdf.examples;
import hep.aida.*;
import hep.aida.ref.pdf.Dependent;
import hep.aida.ref.pdf.FunctionConverter;
import hep.aida.ref.pdf.Gaussian;
import hep.aida.ref.pdf.Parameter;
import hep.aida.ref.pdf.PdfFitter;
import hep.aida.ref.pdf.Sum;
import java.util.Random;
public class NonParametricUnbinnedFit {
public static void main(String[] args) {
IAnalysisFactory analysisFactory = IAnalysisFactory.create();
ITreeFactory treeFactory = analysisFactory.createTreeFactory();
ITree tree = treeFactory.create();
IHistogramFactory histogramFactory = analysisFactory.createHistogramFactory(tree);
IFunctionFactory functionFactory = analysisFactory.createFunctionFactory(tree);
IFitFactory fitFactory = analysisFactory.createFitFactory();
IPlotter plotter = analysisFactory.createPlotterFactory().create("Plotter");
ICloud1D c1 = histogramFactory.createCloud1D("Cloud 1D");
Random r_1 = new Random(123);
Random r_2 = new Random(456);
for (int i = 0; i < 100000; i++) {
double x = r_1.nextGaussian();
// if (r_1.nextDouble() < 0.2) {
// x += 3 * r_2.nextGaussian();
// }
c1.fill(x);
}
Gaussian g = new Gaussian("myGauss");
IModelFunction gauss = FunctionConverter.getIModelFunction(g);
IRangeSet r1 = gauss.normalizationRange(0);
r1.excludeAll();
r1.include(c1.lowerEdge(),c1.upperEdge());
gauss.setParameter("mean",c1.mean());
gauss.setParameter("sigma",c1.rms());
IFitter gaussFit = fitFactory.createFitter("chi2","jminuit","noClone=true");
// Fit the first gaussian
long start = System.currentTimeMillis();
c1.convertToHistogram();
IFitResult gaussFitResult = gaussFit.fit(c1.histogram(),gauss);
long end = System.currentTimeMillis();
long time = end-start;
System.out.println("Chi2 "+gaussFitResult.quality());
/*
Dependent x = new Dependent("x", c1.lowerEdge(), c1.upperEdge());
Parameter m1 = new Parameter("mean1", c1.mean(), 0.01);
Parameter s1 = new Parameter("sigma1", 1);
Parameter m2 = new Parameter("mean2", c1.mean(), 0.01);
Parameter s2 = new Parameter("sigma2", 3);
//Create two gaussians
Gaussian gauss1 = new Gaussian("myGauss1", x, m1, s1);
Gaussian gauss2 = new Gaussian("myGauss2", x, m2, s2);
//Add the gaussians
Sum s = new Sum("Sum of Gauss", gauss1, gauss2);
Parameter f0 = s.getParameter("f0");
f0.setValue(0.2);
f0.setBounds(0, 1);
IModelFunction fitFunction = FunctionConverter.getIModelFunction(gauss1);
IFitter gaussFit = fitFactory.createFitter("Chi2","jminuit","noClone=true");
c1.convertToHistogram();
IFitResult gaussFitResult = gaussFit.fit(c1.histogram(),fitFunction);
System.out.println("Chi2 "+gaussFitResult.quality());
// PdfFitter fitter = new PdfFitter("uml", "minuit");
// fitter.fit(c1, gauss1);
plotter.show();
plotter.region(0).plot(c1.histogram());
plotter.region(0).plot(gaussFitResult.fittedFunction());
/*
System.out.println("Mean1 " + s.getParameter("mean1").value());
System.out.println("sigma1 " + s.getParameter("sigma1").value());
System.out.println("mean2 " + s.getParameter("mean2").value());
System.out.println("sigma2 " + s.getParameter("sigma2").value());
ICloud1D signal = hf.createCloud1D("Signal");
ICloud1D background = hf.createCloud1D("Background");
ICloud1D data = hf.createCloud1D("Data");
Random r = new Random();
// Fill the Signal distribution
for (int i = 0; i < 1000; i++ ) {
signal.fill(r.nextGaussian());
}
// Fill the Background distribution with less points
for (int i = 0; i < 1000; i++ ) {
background.fill(1+ 3*r.nextGaussian());
}
// Fill the Data with a 10% background
Random ratio = new Random();
for (int i = 0; i < 5000; i++ ) {
if ( ratio.nextDouble() < 0.9 )
data.fill(r.nextGaussian());
else
data.fill(1+ 3*r.nextGaussian());
}
// Create IFitData to feed to the nonParametric function
IFitData signalData = fitFactory.createFitData();
signalData.create1DConnection(signal);
IFitData backgroundData = fitFactory.createFitData();
backgroundData.create1DConnection(background);
//Create the nonParametric functions
IFunction signalFunction = new NonParametricFunction("signalFunction",signalData);
IFunction backgroundFunction = new NonParametricFunction("signalFunction",backgroundData);
ArrayList functionsToSum = new ArrayList();
functionsToSum.add(signalFunction);
functionsToSum.add(backgroundFunction);
IFunction finalDistribution = new SumOfFunctions("Distribution",functionsToSum);
String[] pars = finalDistribution.parameterNames();
finalDistribution.setParameter(pars[0],0.5);
finalDistribution.setParameter(pars[1],0.5);
for( int j = 0; j < pars.length; j++) {
String par = pars[j];
System.out.println("*** "+pars[j]+" "+finalDistribution.parameter(par));
}
IFitter jminuit = fitFactory.createFitter("uml","jminuit","noClone=true");
IFitResult jminuitResult = jminuit.fit(data,finalDistribution);
IPlotter plotter = af.createPlotterFactory().create("Plotter");
plotter.show();
plotter.createRegions(2,2);
plotter.region(0).plot(signal);
plotter.region(1).plot(background);
plotter.region(2).plot(data);
plotter.region(2).plot(jminuitResult.fittedFunction());
System.out.println("jminuit Chi2="+jminuitResult.quality());
IFunction finalFunction = jminuitResult.fittedFunction();
pars = finalFunction.parameterNames();
for( int j = 0; j < pars.length; j++) {
String par = pars[j];
System.out.println("*** "+pars[j]+" "+finalFunction.parameter(par));
*/
}
}