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];