#include #include #include #include #include #include #include "Prof.h" #include "fitPar.h" #include #include #include #include #include #include #include #include #include #include #include Prof* profGlobal; bool debug; int fitPar (Prof* prof, vector freePar){ // set up start values, step sizes, etc. for fit profGlobal = prof; // communicate to fcn via global int npar = prof->npar(); int N = prof->N(); int M = prof->M(); vector parVec = prof->parVec(); vector sigParVec = prof->sigParVec(); const int maxpar = 100; double par[maxpar]; string parName[maxpar]; double stepSize[maxpar]; double minVal[maxpar]; double maxVal[maxpar]; prof->getStartPar(); // sets m_startPar, m_stepSize for (int i=0; istartPar(i); stepSize[i] = prof->stepSize(i); } for (int i=0; i> iString; parName[i] = "p" + iString; } for (int i=0; iminuit(); bool verbose = true; if ( verbose ) { minuit->SetPrintLevel(1); } else { minuit->SetPrintLevel(-1); // cout << "set print level" << endl; int ierr = 0; minuit->mnexcm("SET NOWarnings", 0, 0, ierr); // cout << "set no warnings" << endl; } minuit->SetFCN(fcn); for (int i=0; iDefineParameter(i, parName[i].c_str(), par[i], stepSize[i], minVal[i], maxVal[i]); } for (int i=0; iFixParameter(i); } else { minuit->Release(i); } } // check the data // for (int i=0; iy(i) << " " // << prof->u(i) << endl; // } // do the fit and extract results (skip fit if no free parameters!) int status = 0; int nFreePar = minuit->GetNumFreePars(); if ( nFreePar > 0 ) { status = minuit->Command("MIGRAD"); // cout << "after migrad: status = " << status << endl; // status = minuit->Command("HESSE"); // cout << "after hesse: status = " << status << endl; if ( status != 0 ) { debug = true; status = minuit->Command("SIMPLEX"); status = minuit->Command("MIGRAD"); debug = false; } } parVec.clear(); sigParVec.clear(); double fitpar[nFreePar], err[nFreePar]; for (int i=0; iGetParameter(i, fitpar[i], err[i]); parVec.push_back(fitpar[i]); sigParVec.push_back(err[i]); } prof->setParVec(parVec); prof->setSigParVec(sigParVec); // do minos analysis for mu (internally minuit par no. 1) double arglist[10]; int ierr; arglist[0] = 1.; // "up" minuit->mnexcm("SET ERR", arglist, 1, ierr); arglist[0] = 500; // max calls arglist[1] = 0; // 0 for all, 1 for mu only? minuit->mnexcm("MINOS", arglist, 2, ierr); double eplus, eminus, eparab, gcc; minuit->mnerrs(1, eplus, eminus, eparab, gcc); prof->setMinosErrors(eparab, eplus, eminus); if ( status != 0 ) { cout << "status = " << status << endl; cout << "y, u, s..." << endl; for (int i=0; iy(i) << " " << prof->u(i) << " " << prof->s(i) << endl; } cout << "i, par, sig ... " << endl; for (int i=0; inpar(); int M = profGlobal->M(); vector param; for (int i=0; ilnL(param, M); // if ( debug ) { if ( false ) { for (int i=0; i