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 SumOfGaussianFit { 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("Histogram 1D",50,-10,10); ICloud1D c1 = histogramFactory.createCloud1D("Cloud 1D"); Random r_1 = new Random(123); Random r_2 = new Random(456); for (int i=0; i<10000; i++) { double x = r_1.nextGaussian(); if ( r_1.nextDouble() < 0.2 ) x += 3*r_2.nextGaussian(); h1.fill(x); c1.fill(x); } Dependent x = new Dependent("x",-20,20); Parameter m1 = new Parameter("mean1",h1.mean(),0.01); Parameter s1 = new Parameter("sigma1",1); Parameter m2 = new Parameter("mean2",h1.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 Parameter f0 = new Parameter("f0", 0.2, 0, 1); Sum sum = new Sum("Sum of Gauss",gauss1, gauss2,f0); sum.getNormalizationParameter().setValue(h1.maxBinHeight()); IRangeSet r1 = sum.normalizationRange(0); r1.excludeAll(); r1.include(c1.lowerEdge(),c1.upperEdge()); IFitter fitter = fitFactory.createFitter("chi2","jminuit","noClone=true"); fitter.setUseFunctionGradient(false); IFitResult result = fitter.fit(h1,sum); System.out.println("Quality: "+result.quality()); 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(sum); plotter.region(0).plot(gauss1); plotter.region(0).plot(gauss2); plotter.show(); } }