00001 // @(#)root/minuit2:$Id: GaussFcn2.cxx 20880 2007-11-19 11:23:41Z rdm $ 00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005 00003 00004 /********************************************************************** 00005 * * 00006 * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT * 00007 * * 00008 **********************************************************************/ 00009 00010 #include "GaussFcn2.h" 00011 #include "GaussFunction.h" 00012 00013 #include <iostream> 00014 #include <assert.h> 00015 00016 namespace ROOT { 00017 00018 namespace Minuit2 { 00019 00020 00021 double GaussFcn2::operator()(const std::vector<double>& par) const { 00022 00023 assert(par.size() == 6); 00024 00025 GaussFunction gauss1 = GaussFunction(par[0], par[1], par[2]); 00026 GaussFunction gauss2 = GaussFunction(par[3], par[4], par[5]); 00027 00028 double chi2 = 0.; 00029 int nmeas = fMeasurements.size(); 00030 for(int n = 0; n < nmeas; n++) { 00031 chi2 += ((gauss1(fPositions[n]) + gauss2(fPositions[n]) - fMeasurements[n])*(gauss1(fPositions[n]) + gauss2(fPositions[n]) - fMeasurements[n])/fMVariances[n]); 00032 } 00033 00034 return chi2; 00035 } 00036 00037 void GaussFcn2::Init() { 00038 00039 // calculate initial Value of chi2 00040 00041 int nmeas = fMeasurements.size(); 00042 double x = 0.; 00043 double x2 = 0.; 00044 double norm = 0.; 00045 double dx = fPositions[1]-fPositions[0]; 00046 double c = 0.; 00047 for(int i = 0; i < nmeas; i++) { 00048 norm += fMeasurements[i]; 00049 x += (fMeasurements[i]*fPositions[i]); 00050 x2 += (fMeasurements[i]*fPositions[i]*fPositions[i]); 00051 c += dx*fMeasurements[i]; 00052 } 00053 double mean = x/norm; 00054 double rms2 = x2/norm - mean*mean; 00055 00056 // std::cout<<"FCN initial mean: "<<mean<<std::endl; 00057 // std::cout<<"FCN initial sigma: "<<sqrt(rms2)<<std::endl; 00058 00059 std::vector<double> par; 00060 par.push_back(mean); par.push_back(sqrt(rms2)); par.push_back(c); 00061 par.push_back(mean); par.push_back(sqrt(rms2)); par.push_back(c); 00062 00063 fMin = (*this)(par); 00064 // std::cout<<"GaussFcnHistoData2 initial chi2: "<<fMin<<std::endl; 00065 00066 } 00067 00068 00069 } // namespace Minuit2 00070 00071 } // namespace ROOT