// @(#)root/minuit2:$Id$ // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005 /********************************************************************** * * * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT * * * **********************************************************************/ #include "GaussFcn2.h" #include "GaussFunction.h" #include #include namespace ROOT { namespace Minuit2 { double GaussFcn2::operator()(const std::vector& par) const { assert(par.size() == 6); GaussFunction gauss1 = GaussFunction(par[0], par[1], par[2]); GaussFunction gauss2 = GaussFunction(par[3], par[4], par[5]); double chi2 = 0.; int nmeas = fMeasurements.size(); for(int n = 0; n < nmeas; n++) { chi2 += ((gauss1(fPositions[n]) + gauss2(fPositions[n]) - fMeasurements[n])*(gauss1(fPositions[n]) + gauss2(fPositions[n]) - fMeasurements[n])/fMVariances[n]); } return chi2; } void GaussFcn2::Init() { // calculate initial Value of chi2 int nmeas = fMeasurements.size(); double x = 0.; double x2 = 0.; double norm = 0.; double dx = fPositions[1]-fPositions[0]; double c = 0.; for(int i = 0; i < nmeas; i++) { norm += fMeasurements[i]; x += (fMeasurements[i]*fPositions[i]); x2 += (fMeasurements[i]*fPositions[i]*fPositions[i]); c += dx*fMeasurements[i]; } double mean = x/norm; double rms2 = x2/norm - mean*mean; // std::cout<<"FCN initial mean: "< par; par.push_back(mean); par.push_back(sqrt(rms2)); par.push_back(c); par.push_back(mean); par.push_back(sqrt(rms2)); par.push_back(c); fMin = (*this)(par); // std::cout<<"GaussFcnHistoData2 initial chi2: "<