# How to use fits
from java.awt import Color
from java.util import Random
from jhplot import HPlot
from jhplot import H1D,F1D
from hep.aida import *
c1 = HPlot("Canvas",600,400,0.12,1, 1)
c1.gTitle("Fit example"); #put title
c1.visible(1)
c1.setAutoRange()
min=-3.0
max=3.0
h1 = H1D("Simple1",50, min, max)
rand = Random()
# fill histogram
for i in range(5000):
h1.fill(rand.nextGaussian())
h1.setPenWidthErr(2)
h1.setStyle("p")
h1.setSymbol(4)
h1.setDrawLine(0)
c1.setNameX("Xaxis")
c1.setNameY("Yaxis");
c1.setName("Canvas title")
c1.drawStatBox(h1)
# create all factories
c1.factories();
# access IAnalysisFactory
af = c1.analF()
# access ITreeFactory
tf=c1.treeF()
# access IFitFactory
fitf=c1.fitF()
# access IFunctionFactory
funcF=c1.funcF()
# access IHistogramFactory
funcF=c1.histF()
# make fit using JAIDA
fitter = fitf.createFitter( "chi2", "jminuit" )
result = fitter.fit(h1.get(), "g" )
fresult=result.fittedFunction();
fPars = result.fittedParameters()
fParErrs = result.errors()
fParNames = result.fittedParameterNames()
print "Fit results:"
for i in range(fresult.numberOfParameters()):
print(fParNames[i]+" : "+str(fPars[i])+" +- "+str(fParErrs[i]))
# make F1D function from IFunction in the same range as histogram
f2 = F1D(fresult,min,max)
f2.setColor(Color.blue)
f2.setPenWidth(3);
# draw fit line
c1.draw(f2)
# draw histogram on top
c1.draw(h1)
# export to png
c1.export(Editor.DocMasterName()+".png")
# jHepWork @S.Chekanov