package hep.aida.ref.pdf.test;

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

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