package hep.aida.ref.pdf.examples;

import hep.aida.*;
import java.util.Random;
import hep.aida.ref.pdf.*;
import hep.aida.ref.function.*;

public class ProductOfPdfFit
{
   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();
    
      ICloud1D c1 = histogramFactory.createCloud1D("Cloud 1D");

      for (int i=0; i<100000; i++) {
//          double x = cern.jet.random.Normal.staticNextDouble(0, 2);
//          if ( x > .5 )
//              x = cern.jet.random.Exponential.staticNextDouble(0.3);
//          c1.fill(x);
      }

      IHistogram1D h1 = histogramFactory.createHistogram1D("Histogram 1D",50,c1.lowerEdge(),c1.upperEdge());
      c1.fillHistogram(h1);

      Dependent x = new Dependent("x",c1.lowerEdge(),c1.upperEdge());

      Parameter m = new Parameter("mean", 0);
      Parameter s = new Parameter("sigma", 2);
      Gaussian gauss = new Gaussian("myGauss", x, m, s);

      Parameter le = new Parameter("le",c1.lowerEdge());
      Parameter ue = new Parameter("ue",c1.upperEdge());
      Parameter a = new Parameter("a",0.5);
      Step lowerStep = new Step("lowerStep",x,le,a);
      Step upperStep = new Step("upperStep",x,a,ue);
      
      Parameter tau = new Parameter("tau",0.3);
      Exponential expo = new Exponential("exp",x, tau, Exponential.DECAY);
      IModelFunction exp = FunctionConverter.getIModelFunction(expo);

      Product p1f = new Product("p1",lowerStep,gauss);
      Product p2f = new Product("p2",upperStep,expo);
      
      IModelFunction p1 = FunctionConverter.getIModelFunction(p1f);
      IModelFunction p2 = FunctionConverter.getIModelFunction(p2f);

      Sum ss = new Sum("total dist",p1f, p2f);
      IModelFunction sum = FunctionConverter.getIModelFunction(ss);

      IFitter fit = fitFactory.createFitter("uml","minuit","noClone=true");
  
      fit.fitParameterSettings("mean").setStepSize(0.01);
      fit.fitParameterSettings("f0").setStepSize(0.1);
      fit.fitParameterSettings("f0").setBounds(0,1);

      fit.fitParameterSettings("le").setFixed(true);
      fit.fitParameterSettings("ue").setFixed(true);
      fit.fitParameterSettings("a").setFixed(true);


      long start = System.currentTimeMillis();
  
      IFitResult fitResult = fit.fit(c1,p1);
      long end = System.currentTimeMillis();
      long time = end-start;

      System.out.println("Time to fit : "+time);

      double h1Norm = h1.sumBinHeights()*(h1.axis().upperEdge()-h1.axis().lowerEdge())/h1.axis().bins();
      h1.scale(1./h1Norm);
      plotter.region(0).plot(h1);
      plotter.region(0).plot(fitResult.fittedFunction());
      plotter.show();
   }
}
 

Ads help maintain this website.