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));
     */
    }
}
 

Ads help maintain this website.