package hep.aida.ref.function.examples;
import hep.aida.ref.pdf.examples.*;
import hep.aida.*;
import hep.aida.ref.function.NonParametricFunction;
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 < 1000; i++) {
double x = r_1.nextGaussian();
// if (r_1.nextDouble() < 0.2) {
// x += 3 * r_2.nextGaussian();
// }
c1.fill(x);
}
IFitData data = fitFactory.createFitData();
data.create1DConnection(c1);
NonParametricFunction f = new NonParametricFunction("Non Parametric Function", data);
plotter.show();
plotter.region(0).plot(c1);
plotter.region(0).plot(f);
/*
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));
*/
}
}