#include #include #include #include #include #include #include "PLFit.h" #include "PLUtil.h" #include "fitPar.h" #include #include #include #include #include #include #include #include #include #include PLFit* plfGlobal; bool debug; int fitPar (PLFit* plf, int npar, double& chi2Min, vector& theta, vector >& V){ plfGlobal = plf; // communicate to fcn via global const int maxpar = 100; double par[maxpar]; string parName[maxpar]; double stepSize[maxpar]; double minVal[maxpar]; double maxVal[maxpar]; for (int i=0; i> parNumber; parName[i] = "p" + parNumber; } for (int i=0; iSetPrintLevel(-1); int ierr = 0; minuit->mnexcm("SET NOWarnings",0,0,ierr); minuit->SetFCN(fcn); for (int i=0; iDefineParameter(i, parName[i].c_str(), par[i], stepSize[i], minVal[i], maxVal[i]); } // do the fit and extract results status = minuit->Command("MIGRAD"); if ( status != 0 ) { debug = true; status = minuit->Command("SIMPLEX"); status = minuit->Command("MIGRAD"); debug = false; } theta.clear(); int nFreePar = minuit->GetNumFreePars(); double fitpar[nFreePar], err[nFreePar]; for (int i=0; iGetParameter(i, fitpar[i], err[i]); theta.push_back(fitpar[i]); } double covMatrix[npar][npar]; minuit->mnemat(&covMatrix[0][0], npar); V.clear(); for (int i=0; i rowI; for (int j=0; jmnstat(chi2Min, fedm, errdef, npari, nparx, istat); delete minuit; } // only chi2 or do fit return status; // 0 = normal completion, 4 = MIGRAD not converged } //------------------------------------------------------------------------- // fcn must be non-member function, uses global PLFit object fit void fcn(int& npar, double* deriv, double& f, double par[], int flag){ PLFit* plf = plfGlobal; vector pdfPar; // for now not used vector modelBeta; for (int i=0; inuTot(); int opt = plf->fitOption(); plf->setModelHist(pdfPar, modelBeta); double chi2 = 0; for (int i=1; i<=plf->nBin(); i++){ double n = plf->dataHist()->GetBinContent(i); double nu = plf->modelHist()->GetBinContent(i); if ( n > 0. && nu > 0. ) { chi2 += 2 * (n * log(n/nu) + nu - n); } else { chi2 += nu - n; } } f = chi2; // pass back by reference }