// File: fitPar.cc // Glen Cowan // RHUL Physics // Uses TMinuit to fit the MLEs muHat, bHat and conditional MLEs bHatHat // used in profile likelihood ratio. // Inputs: // mu signal strength parameter (0 = background only, 1 = nominal). // n number of events seen in data, e.g. generate from Poisson(mu*s+b) // s expected number of signal events // m vector of numbers of events seen in subsidiary measurements. // tau defined by m_i ~ Poisson(tau_i*b_i), e.g., ratio of MC lumonisity // to that of data sample. #include #include #include #include #include #include #include "SigCalc.h" #include "fitPar.h" #include SigCalc* scGlobal; // needs to be global to communicate with fcn (below) bool debug; int fitPar (SigCalc* sc, vector freePar, vector& parVec){ // set up start values, step sizes, etc. for fit scGlobal = sc; // communicate to fcn via global int npar = parVec.size(); const int maxpar = 100; double par[maxpar]; string parName[maxpar]; double stepSize[maxpar]; double minVal[maxpar]; double maxVal[maxpar]; for (int i=0; i> bckNumber; parName[i] = "b" + bckNumber; } 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]); } for (int i=0; iFixParameter(i); } } // do the fit and extract results int status = minuit->Command("MIGRAD"); if ( status != 0 ) { debug = true; status = minuit->Command("SIMPLEX"); status = minuit->Command("MIGRAD"); debug = false; } parVec.clear(); int nFreePar = minuit->GetNumFreePars(); double fitpar[nFreePar], err[nFreePar]; for (int i=0; iGetParameter(i, fitpar[i], err[i]); parVec.push_back(fitpar[i]); } delete minuit; return status; // 0 = normal completion, 4 = MIGRAD not converged } //------------------------------------------------------------------------- // fcn must be non-member function, uses global SigCalc object scGlobal void fcn(int& npar, double* deriv, double& f, double par[], int flag){ int numBck = scGlobal->numBck(); double mu = par[0]; vector bVec; for (int i=0; ilnL(mu, bVec); // if ( debug ) { // for (int i=0; i