package hep.aida.ref.test.pdf; import hep.aida.ICloud1D; import hep.aida.ref.pdf.Dependent; 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 SumOfGaussianFit extends AbstractPdfTestCase { private ICloud1D c1; public SumOfGaussianFit(String name) { super(name); 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); } } public void testFit() { 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); PdfFitter fitter = new PdfFitter("uml","minuit"); fitter.fit(c1,s); assertEquals(c1.mean(), s.getParameter("mean1").value(),0.01); assertEquals(1, s.getParameter("sigma1").value(),0.02); assertEquals(c1.mean(), s.getParameter("mean2").value(),0.01); assertEquals(3, s.getParameter("sigma2").value(),0.2); } }