package org.freehep.math.minuit.example.sim;
import org.freehep.math.minuit.FCNBase;
/**
*
* @version $Id: GaussFcn2.java 8584 2006-08-10 23:06:37Z duns $
*/
class GaussFcn2 implements FCNBase
{
GaussFcn2(double[] meas, double[] pos, double[] mvar)
{
theMeasurements = meas;
thePositions = pos;
theMVariances = mvar;
theMin =0;
init();
}
void init()
{
// calculate initial value of chi2
int nmeas = theMeasurements.length;
double x = 0.;
double x2 = 0.;
double norm = 0.;
double dx = thePositions[1]-thePositions[0];
double c = 0.;
for(int i = 0; i < nmeas; i++)
{
norm += theMeasurements[i];
x += (theMeasurements[i]*thePositions[i]);
x2 += (theMeasurements[i]*thePositions[i]*thePositions[i]);
c += dx*theMeasurements[i];
}
double mean = x/norm;
double rms2 = x2/norm - mean*mean;
double[] par = { mean, Math.sqrt(rms2), c, mean, Math.sqrt(rms2), c };
theMin = valueOf(par);
}
public double valueOf(double[] par)
{
assert(par.length == 6);
GaussFunction gauss1 = new GaussFunction(par[0], par[1], par[2]);
GaussFunction gauss2 = new GaussFunction(par[3], par[4], par[5]);
double chi2 = 0.;
int nmeas = theMeasurements.length;
for(int n = 0; n < nmeas; n++)
{
double e1 = gauss1.valueAt(thePositions[n]) + gauss2.valueAt(thePositions[n]) - theMeasurements[n];
chi2 += e1*e1/theMVariances[n];
}
return chi2;
}
double[] measurements()
{
return theMeasurements;
}
double[] positions()
{
return thePositions;
}
double[] variances()
{
return theMVariances;
}
private double[] theMeasurements;
private double[] thePositions;
private double[] theMVariances;
private double theMin;
}