23 std::vector<double> FumiliStandardChi2FCN::Elements(
const std::vector<double>& par)
const {
26 std::vector<double> result;
28 unsigned int fPositionsSize = fPositions.size();
31 for(
unsigned int i=0; i < fPositionsSize; i++) {
33 const std::vector<double> & currentPosition = fPositions[i];
38 tmp1 = (*(this->ModelFunction()))(par, currentPosition)- fMeasurements[i];
40 result.push_back(tmp1*fInvErrors[i] );
53 const std::vector<double> & FumiliStandardChi2FCN::GetMeasurement(
int index)
const {
55 return fPositions[index];
60 int FumiliStandardChi2FCN::GetNumberOfMeasurements()
const {
62 return fPositions.size();
68 void FumiliStandardChi2FCN::EvaluateAll(
const std::vector<double> & par) {
72 int nmeas = GetNumberOfMeasurements();
73 std::vector<double> & grad = Gradient();
74 std::vector<double> & h = Hessian();
75 int npar = par.size();
78 h.resize( static_cast<unsigned int>(0.5 * npar* (npar + 1) ) );
80 grad.assign(npar, 0.0);
81 h.assign(static_cast<unsigned int>(0.5 * npar* (npar + 1) ) , 0.0);
84 const ParametricFunction & modelFunc = *ModelFunction();
86 for (
int i = 0; i < nmeas; ++i) {
89 const std::vector<double> & currentPosition = fPositions[i];
90 modelFunc.SetParameters( currentPosition );
91 double invError = fInvErrors[i];
92 double fval = modelFunc(par);
94 double element = ( fval - fMeasurements[i] )*invError;
95 chi2 += element*element;
100 std::vector<double> mfg = modelFunc.GetGradient(par);
103 for (
int j = 0; j < npar ; ++j) {
104 double dfj = invError * mfg[j];
105 grad[j] += 2.0 * element * dfj;
109 for (
int k = j; k < npar; ++ k) {
110 int idx = j + k*(k+1)/2;
111 h[idx] += 2.0 * dfj * invError * mfg[k];