210 likes | 323 Vues
This documentation outlines the powerful fitting capabilities within JAIDA, a Java implementation of AIDA, emphasizing ease of use and flexibility. It covers general fitting concepts, various models and functions, parameter optimization, and different fit methods such as least squares and chi². Users can configure fitting processes, support simultaneous fits across datasets, and access a range of optimizers. The document includes practical examples of both binned and unbinned fits, demonstrating the creation of fit factories and the use of histogram data for analysis.
E N D
Fitting in AIDA • General Concepts • Requirements • JAIDA • Examples • Interfaces Overview • Conclusions
General Concepts • The main players: • Data Set • the actual data, i.e. an Histogram • Model or Function • a set of parametric shapes to describe the data • Fitter • the engine that finds the best fit between the data and the model by changing a set of paramters • Fit Method • the method used by the fitter to evaluate the “best fit”, i.e. Chi2, Least Squares etc. • Fit Result • the actual result of a fit • new set of parameters • covariance matrix • contours • scans • Optimizer • the engine that calculates the minimum (or maximum) of the problem
User General Concepts Optimizing Optimizer Model/Function Result
Fit Method Data Set Model/Function User General Concepts Fitting Optimizer Fitter Fit Result
Requirements • Easy to use and configure • change fit method • change data set • change model • Easy access to pool of optimizers • Minuit is a must, but not the only product. Many optimizers are available. • Accept user-provided custom functions • Straightforward way to build complicated models • Add, multiply and convolute (analytically when possible)
Requirements • Same interface for binned and unbinned fits • binned fit to histogram • unbinned fit to a tuple • Similar interfaces for fitting and optimization • Multiple fit methods supported • least squares • chi2 • …user defined (advanced) • Support for simultaneous fits • fits over different data sets
JAIDA • JAIDA is our Java implementation of AIDA • http://java.freehep.org/jaida/index.html • Fitting implementation: • fit methods • least squares • “leastsquares”, “ls” • chi2 • “chi2”, “chisquared” • clever chi2 • “cleverchi2”, cleverchisquared” • binned maximum likelihood • “bml”, “binnedmaxlikelihood”, binnedmaximumlikelihood” • unbinned maximum likelihood • “uml”, “unbinnedmaxlikelihood”, “unbinnedmaximumlikelihood” • engines • Minuit • Uncmin (pure java code)
JAIDA • built-in functions • gaussian “g” • “amplitude”, “mean”, “sigma” • exponential “e” • “amplitude”, “exponent” • polynomials “p0”,”p1”,… • “p1”,”p2”… • Clear distinction between optimization and error analysis • easy to adopt new optimizers • The examples below are based on JAIDA • other implementations might have different fit methods or optimizers.
Examples Binned fit to an IHistogram //Create the factories … IFitter fitter = af.createFitFactory().createFitter(); //Perform the fit IFitResult result = fitter.fit(hist,”g”); //Plot the result IPlotter p = af.createPlotterFactory().create(); p.region(0).plot(hist); p.region(0).plot(result.fittedFunction()); p.show()
Examples Binned fit to a 2D Histogram //Create the factories … IFunctionfactory funcFactory = af.createFunctionFactory( tree ); IFitter fitter = af.createFitFactory().createFitter("chi2","minuit"); //Create a scripted function, a sum of two gaussians IFunction func = funcFactory.createFunctionFromScript("twoDdistr",2,"N*(a*exp( -(x[0]-mu0)*(x[0]-mu0)/(2*s0*s0) )+(1-a)*exp( -(x[0]-mu1)*(x[0]-mu1)/(2*s1*s1) ))*exp( -(x[1]-mu2)*(x[1]-mu2)/(2*s2*s2) )","N,a,mu0,s0,mu1,s1,mu2,s2","",null); //Set the initial parameters double[] initialPars = { 1, 0.8, 5, 1, 5, 2, 0, 1}; func.setParameters( initialPars ); //Control the parameters and set constraints fitter.fitParameterSettings("mu2").setFixed(true); fitter.fitParameterSettings("a").setBounds(0.5,0.9); fitter.fitParameterSettings("a").setStepSize(0.001); fitter.fitParameterSettings("s1").setBounds(2,4); fitter.fitParameterSettings("s1").setStepSize(0.1); fitter.setConstraint("s0 = s2"); fitter.setConstraint("mu0 = mu1"); //Perform the fit IFitResult fitResult = fitter.fit(hist2d,func);
Examples Unbinned Fit //Create the factories … IFunctionfactory funcFactory = af.createFunctionFactory( tree ); IFitFactory fitf = af.createFitFactory(); IFitter fitter = fitf.createFitter(“uml",“uncmin"); IFitData data = fitf.createFitData(); ITupleFactory tupf = af.createTupleFactory(tree); //Create a function, control the parameters, set bounds and constraints… //… //Get and ITuple and create an IEvaluator for its columns ITuple tuple = (ITuple) tree.find(“myTuple”); IEvaluator eval = tupf.createEvaluator(“sqrt(px*px + py*py)”); //Connect the data set to the ITuple through the IEvaluator data.createConnection(tuple, eval); //Perform the fit IFitResult fitResult = fitter.fit(data,func);
Interfaces Overview The factories • From IAnalysisFactory • IFitFactory createFitFactory() • IFunctionFactory createFunctionFactory(ITree) • IFitFactory creates • fitters • data sets (for advanced data handling) • e.g. select columns from tuple • IFunctionFactory creates • functions
Interfaces Overview IFitFactory • Methods • IFitData createFitData() • IFitter createFitter(fitMethod,engine) • Through IFitData connections to all the AIDA data objects are established • IFitter is the main fitting engine
Interfaces Overview IFunctionFactory • IFunction creatFunctionByName(name,model) • IFunction createFunctionFromScript(……) • IFunction cloneFunction(name, function) • IFunctionCatalog catalog() • “byName” are built-in functions • “fromScript” are scripted functions • user-defined functions • e.g. define “Gauss+Gauss+Pol1+…” to be “myFavoriteFunc” • …that can be added to a function catalog for future use
Interfaces Overview IFitter • Do the fit • IFitResult fit(“data”,”model”,”pars”) • IDataPointSet createContour(IFitData, IFitResult…..) • IDataPointSet createScan1D(IFitData, IFunction…) • Configure the fitter • void setFitMethod(String) • String fitMethodName() • void setEngine(String) • String engineName() • void setUseFunctionGradient(boolean) • boolean userFunctionGradient() • Control the parameters in the fit • IFitParameterSetting fitParameterSettings(String) • String[] listParameterSettings() • void resetParameterSettings()
Interfaces Overview IFitter • Constraints • void setConstraint(String) • String[] constraints() • void resetConstraints() • The fitter does not change the function; the fitted parameters are in the IFitResult
Interfaces Overview IFitResult • Fit outcome • int fitStatus() • int ndf() • double quality() • Fit info • String fitMethodName() • String engineName() • String dataDescription() • String[] constraints() • Fitted function • IFunction fittedFunction() • String[] fittedParameterNames() • double fittedParameter(String) • double fittedParameters() • IFitParameterSettings fitParameterSettings(String) • Errors • double covMatrixElement(int,int) • double[] errors() • double[] errorsMinus() • double[] errorsPlus()
Interfaces Overview IFitData • Connect the data • create1DConnection(…) • create2DConnection(…) • create3DConnection(…) • createConnection(…) • Ranges • IRangeSet range(int) • Utils • String dataDescription() • int dimension() • reset()
Interfaces Overview IFunction • General • double value(double[]) • double[] gradient(double[] x) • int dimension() • int numberOfParameters() • boolean providesGradient() • Variables • String variableName(int) • String[] variableNames() • Parameters • String[] parameterNames() • double[] parameters() • double parameter(String) • int indexOfParameter(String) • void setParameter(String,double) • void setParameters(double[])
Interfaces Overview IFitParameterSettings • Control a parameter • Bounds • double lowerBound() • void setLowerBound(double) • double upperBound() • void setUpperBound() • boolean isBound() • void setBounds(double, double) • void removeBounds() • Step • void setStepSize(double) • double stepSize() • Fix • boolean isFixed() • void setFixed(boolean) • Other • void reset() • String name()
Conclusions • AIDA has a complete set of interfaces for fitting • flexible interfaces • room for improvements • JAIDA future: • Extend the pool of optimizers • Implement more built-in functions • Allow model-building