import hep.aida.*;
import java.util.Random;
import hep.aida.ref.function.*;
public class GaussFit {
  static double[] data= new double[50000];
  static int nevent = 0;
  

  static void GenerateData() {
    nevent=10000;
    Random r = new Random(1234567);   //inicializacia nahodneho generatora
    for (int i = 0; i < nevent; i++) {
      data[i]=r.nextGaussian();       //generovanie gaussovsky rozdelenych hodnot
    }
    
  }



  public static void main(String[] args){
    Killer.createKiller();
    GenerateData();
    //standardne riadky otvarajuce kniznicu JAIDA
    IAnalysisFactory af = IAnalysisFactory.create();
    IHistogramFactory hf = af.createHistogramFactory(null);

    //kreovanie prazdneho histogramu, 50 binov v intervale (-5,7)
    IHistogram1D h = hf.createHistogram1D("Gauss", 50, -5, 7);


    for (int i = 0; i < nevent; i++) {
      h.fill(data[i]);   //plnenie histogramu
    }

    //definovanie fitovacej funkcie 1 premennej s troma fitovacimi parametrami
    IFunction f = new AbstractIFunction("normal", 1, 3) {
            public double value(double[] v) 
               { return p[0]*
                      Math.exp(- (v[0]-p[1])*(v[0]-p[1])/(2*p[2]*p[2]))/p[2]; }
      };
    
    f.setParameters(new double[] {100.,1.,2.} ); //nastavenie pociatocnych hodnot parametrov

    //standardne dva riadky otvarajuce fitovaci kombajn
    IFitFactory fitFactory = af.createFitFactory();
    IFitter fitter = fitFactory.createFitter("chi2","jminuit","noClone=\"true\"");
    
    IFitResult result = fitter.fit(h,f);   //tu je spustenie fitovacieho kombajnu a vysledok

    IPlotterFactory pf = af.createPlotterFactory(); //otvorenie plotovacej fabriky
    
    IPlotterStyle style = pf.createPlotterStyle();
    style.dataStyle().setParameter("fillHistogramBars","false");//nebude vyfarbovat histogramy
    style.dataStyle().setParameter("functionLineColor","red"); //funkcie bude kreslit cervenou

    IPlotter plotter = pf.create();
    plotter.currentRegion().plot(h,style);//pouzije generovany style na kreslenie histogramu
    plotter.currentRegion().plot(result.fittedFunction(),style);//nakresli vysledok fitu

    plotter.show(); //vsetko zobrazi
  }
}
